sql server—从多个列返回值的sql函数

tvokkenx  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(428)

我一直在开发一些存储过程,并且我一直在重复基于其他一些列派生列的部分代码。因此,我没有将这段代码从一个存储过程复制到另一个存储过程,而是考虑使用一个函数来获取输入列并生成输出列。
基本上,功能如下: SELECT columnA, columnB, columnC, myFunction(columnA, columnB) as columnD FROM myTable 如我们所见,这个函数将把a列和b列作为输入,然后返回d列。
然而,根据一些研究,在使用这样的udf(user-defined)函数时,它似乎存在一些性能问题。是真的吗?处理这种情况最好的方法是什么?
谢谢你们。

4jb9z9bj

4jb9z9bj1#

标量函数和多语句表值用户定义函数会导致性能问题,因为它们会隐式地将基于集合的操作转换为基于游标的操作。
但是,内联表值用户定义函数不会遇到此问题。他们跑得很快。
区别在于如何声明函数,以及其中的代码是什么样子。一个多语句函数执行它在tin上所说的操作-它允许您有多个语句。这样地:

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

内联表值函数不返回在函数内部填充的命名表。它返回select语句:

create function quick() returns table as
return
(
    select j = 1, k = 2
);

内联表值函数可以“内联”到外部select语句中,方式与视图大致相同。当然,区别在于udf可以接受参数,而视图不能。
你也必须用不同的方法。使用交叉应用:

select       t.columnA, t.columnB, u.j, u.k
from         MyTable t
cross apply  quick(t.columnA, t.columnB) u

如果不清楚-是的,在您的示例中,您只需要返回一个“标量”值,但这只是一个表值函数,返回一列和一行。因此,与其编写标量函数,不如编写一个执行相同任务的内联表值函数,然后 cross apply 是的。

相关问题