SQL Функция для возврата значения из нескольких столбцов - PullRequest
0 голосов
/ 13 июля 2020

Я разрабатывал несколько хранимых процедур и повторял часть кода, которая выводит столбец на основе нескольких других столбцов. Поэтому вместо копирования этого фрагмента кода из одной хранимой процедуры в другую я подумываю создать функцию, которая принимает входные столбцы и создает выходные столбцы.

В основном функция выглядит так:

SELECT columnA, columnB, columnC, myFunction(columnA, columnB) as columnD FROM myTable

Как мы видим, эта функция примет столбец A и столбец B в качестве входных данных, а затем вернет столбец D.

Однако, основываясь на некоторых исследованиях, кажется, что возникают проблемы с производительностью при использовании такой функции UDF (определяемой пользователем). Это правда? Как лучше всего справиться с этой ситуацией?

Спасибо, ребята.

1 Ответ

1 голос
/ 13 июля 2020

Скалярные функции и определяемые пользователем функции с табличным значением с несколькими операторами могут вызывать проблемы с производительностью, поскольку они неявно превращают вашу операцию на основе набора в операцию на основе курсора. * 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 это.

...