Переменная таблицы в пользовательской функции SQL Сервер и производительность UDF - PullRequest
1 голос
/ 08 января 2020

У меня есть UDF, подобный этому

CREATE FUNCTION Lob_function
(
    @policy NVARCHAR(MAX)
    @table  Table
)
RETURNS NVARCHAR(MAX)
AS 
BEGIN
select @policy= 
case
when @policy like '%AMM%' then 'AMM'
when @policy like '%MOT%' then 'MOT'
when @policy like '%MOX%' then 'MOX'
when @policy not like '00%' then LEFT(@policy,3)
end
from @table
return @policy
END;

Я хочу использовать свой UDF для различных случаев, таких как:

Select Lob_function (@policy, @table) from @table.

Появляется ошибка в @table Table, когда я заменяю @ таблица с фиксированной таблицей, моя UDF может быть выполнена, но очень медленно по сравнению с обычным оператором Select.

1 Ответ

2 голосов
/ 08 января 2020

Вы не можете делать то, что хотите.

Во-первых, вы не можете передавать таблицы в качестве параметров в функции. Как объясняет документация :

Параметры могут заменять только константы; их нельзя использовать вместо имен таблиц, имен столбцов или имен других объектов базы данных.

Теоретически вы могли бы использовать Dynami c SQL для построения запрос и запустить его. К сожалению, execute используется только для расширенных функций. Это немного скрыто в документации, но это там :

Пользовательские функции не могут использовать динамические c SQL или временные таблицы. Табличные переменные допускаются.

Это действительно не оставляет хороших вариантов. Вы можете попытаться придумать другой подход, который не требует хранения связанных данных в нескольких различных таблицах. Или, возможно, вы можете использовать хранимую процедуру вместо UDF.

Существуют некоторые очень запутанные обходные пути, которые включают использование расширенной хранимой процедуры или CLR для выполнения пакетной команды, которая, в свою очередь, передает запрос в база данных. Это действительно сложно, подвержено ошибкам, и я никогда не видел его в производственном коде.

...