为什么我们在SQL中使用标量值函数

时间:2011-08-10 08:57:56

标签: sql

如果标量值函数或任何用户定义函数的性能低于SP 为什么我们需要通过用户定义的函数而不是简单的SP?

3 个答案:

答案 0 :(得分:1)

您使用的内容取决于要求。

函数(包括标量)可以在查询中使用并返回一组不同类型,而存储过程只能返回整数值而不能在其他查询中使用

create function dbo.scalarfunc () returns varchar(20) as
begin
    declare @somevalue varchar(20)
    set @somevalue = (select top 1 name from master.sys.tables)
    return @somevalue

end
go

select * from sys.tables
where name = dbo.scalarfunc()

使用SP

create procedure dbo.someproc as 
begin
    declare @somevalue varchar(20)
    set @somevalue = (select top 1 name from master.sys.tables)
    return @somevalue
end
go

declare @somespret varchar(20)
exec @somespret = dbo.someproc

这会导致返回NULL并显示以下消息

  

''someproc'过程试图返回NULL状态,即   不被允许。将返回状态0。'

并且proc返回一个整数

create procedure dbo.someproc as 
begin
    declare @somevalue int
    set @somevalue = (select top 1 object_id from master.sys.tables)
    return @somevalue
end
go

declare @somespret int
exec @somespret = dbo.someproc
select @somespret

这可以工作,但在查询中使用它

从sys.tables中选择* 其中name = dbo.someproc()

会产生消息

  

找不到列“dbo”或用户定义的函数或   聚合“dbo.someproc”,或名称不明确

答案 1 :(得分:1)

因为您可以从选择查询中调用标量值函数,例如。

select f1(name), f2(id) from users

在SP的情况下是不可能的

答案 2 :(得分:0)

UDF在JOIN或WHERE子句中使用时会引入严重的性能问题,并且查询会返回大量数据

SELECT A.*, B.*
FROM A
INNER JOIN B ON B.id = A.id AND B.ExtraCode = calculateExtraCode(A.Name)

因此,对于每个选定的行,将调用UDF,并且问题在于UDF调用引入的调用延迟。它只需通过提取内联SP或查询的UDF体来测试,就可以很容易地观察到差异。

但是如果查询返回少量数据,则将逻辑分成UDF是有意义的,因此主查询/ SP的代码将更加清晰。