Скалярные функции и определяемые пользователем функции с табличным значением с несколькими операторами могут вызывать проблемы с производительностью, поскольку они неявно превращают вашу операцию на основе набора в операцию на основе курсора. * 1001 Эта проблема. Они быстрые.
Разница в том, как вы объявляете функцию и как выглядит код внутри них. Функция с несколькими операторами делает то, что написано на банке, - она позволяет вам иметь несколько операторов. Примерно так:
create function slow() returns @t table(j int, k int) as
begin
declare @j int = 1; -- statement 1
declare @k int = 2; -- statement 2
insert @t values (@j, @k); -- statement 3
return; -- statement 4
end
Функция со встроенным табличным значением не возвращает именованную таблицу, которая заполняется внутри функции. Он возвращает оператор выбора:
create function quick() returns table as
return
(
select j = 1, k = 2
);
Функция с встроенным табличным значением может быть «встроена» во внешний оператор выбора во многом так же, как и представление. Разница, конечно же, в том, что UDF может принимать параметры, а представление не может.
Вы также должны использовать их по-другому. Используйте перекрестное применение:
select t.columnA, t.columnB, u.j, u.k
from MyTable t
cross apply quick(t.columnA, t.columnB) u
В случае, если это неясно - да, в вашем случае вам нужно вернуть только «скалярное» значение, но это просто функция с табличным значением, которая возвращает один столбец и одну строку . Поэтому вместо написания скалярной функции напишите встроенную функцию с табличным значением, которая выполняет ту же работу, и cross apply
это.