Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос по CLR функции  [new]
Mixon
Member

Откуда:
Сообщений: 353
Добрый день!

подскажите как поступить правильно, есть бизнес логика написанная на C# и адаприторанная под CLR, дабы не создавать побочный трафик между клиентом и сервером, так вот задача в том чтобы в функции\процедуре (SQLFuntion\SQLProcedure) иметь возможность читать и записывать данные(SELECT\INSERT)

возможен вариант переписать функцию под возвращение табличного значения и его результат уже в вызвавшей SP сохранять, но что то я не пойму как должен выглядеть инсёрт:


INSERT INTO T(a,b,c) exec my_fun(123)
6 сен 16, 16:56    [19633869]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по CLR функции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Mixon
возможен вариант переписать функцию под возвращение табличного значения и его результат уже в вызвавшей SP сохранять, но что то я не пойму как должен выглядеть инсёрт:

INSERT INTO T(a,b,c) exec my_fun(123)

INSERT INTO T(a,b,c) SELECT a,b,c FROM dbo.my_fun(123)
6 сен 16, 17:29    [19634067]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по CLR функции  [new]
Berd.
Member [заблокирован]

Откуда:
Сообщений: 389
INSERT нельзя делать в функции - можно только в процедуре.
SELECT можно использовать и там, и там.

И вообще, мне всегда казалось, что хорошие практики для использования CLR такие же, как и при использовании UDF:
- Получаем входную строку, обрабатываем, отдаём наружу
- Не использовать вложенных запросов к БД - иначе производительность сильно упадёт.

Один раз рефакторил чужой код - там внутри вьюшки использовалась UDF. UDF в свою очередь делала запрос к БД.
В итоге на каждую выбранную строку, UDF делала запрос к ещё одной таблице.
Когда убрал из кода UDF и переписал просто через JOIN - производительность ускорилась на 2 порядка - в 100 раз.

Так что аккуратнее используйте CLR.
7 сен 16, 18:38    [19639248]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по CLR функции  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Berd.
INSERT нельзя делать в функции - можно только в процедуре.
SELECT можно использовать и там, и там.

В случае с clr это не так.
Там и в функции можно модифицировать данные. С открытием внутри еще одного соединения.
8 сен 16, 22:36    [19645037]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по CLR функции  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4176
Berd.
INSERT нельзя делать в функции - можно только в процедуре.
SELECT можно использовать и там, и там.

И вообще, мне всегда казалось, что хорошие практики для использования CLR такие же, как и при использовании UDF:
- Получаем входную строку, обрабатываем, отдаём наружу
- Не использовать вложенных запросов к БД - иначе производительность сильно упадёт.

Один раз рефакторил чужой код - там внутри вьюшки использовалась UDF. UDF в свою очередь делала запрос к БД.
В итоге на каждую выбранную строку, UDF делала запрос к ещё одной таблице.
Когда убрал из кода UDF и переписал просто через JOIN - производительность ускорилась на 2 порядка - в 100 раз.

Так что аккуратнее используйте CLR.


хмм
9 сен 16, 11:46    [19646520]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по CLR функции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Berd.
Один раз рефакторил чужой код - там внутри вьюшки использовалась UDF. UDF в свою очередь делала запрос к БД.
В итоге на каждую выбранную строку, UDF делала запрос к ещё одной таблице.
Когда убрал из кода UDF и переписал просто через JOIN - производительность ускорилась на 2 порядка - в 100 раз.
Да уж понятно... Особенно, когда сервер выберет такой план, что будет сканиться таблица, и функция будет применяться ко всем строкам :-)
А человек будет думать, "да что такое, запрос возвращает 2 строки, добавил функцию, и стало так медленно!!!"
9 сен 16, 11:57    [19646589]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить