为什么我不能直接打电话给我的UDF?为什么我需要将其深入3级?
-
16-10-2019 - |
题
我刚刚创建了一个UDF并测试它,我发现只有在使用此语法时才能使用
SELECT [PMIS].[dbo].[fnIsReportingTo] (50,1132)
我期望它会这样工作:
select * from fnIsReportingTo (50,1132)
或者
select fnIsReportingTo (50,1132)
这是我的创建SQL:
create function fnIsReportingTo
(
@BossID int,
@EmployeeID int)
RETURNs bit
AS
begin
declare @ret bit
if exists (select * from dbo.fnGetEmployeeHierarchy(@BossID) where employeeID=@employeeID)
select @ret=1
else
select @ret=0
return @ret
end
解决方案
标量 UDF必须具有模式资格。您不需要合格名称的数据库部分,除非当然在其他数据库中。
SELECT [dbo].[fnIsReportingTo] (50,1132)
在《从条款》中,您只能使用 桌子价值 功能
看 “功能类型” 在MSDN中
编辑:作为一个观察,我倾向于避免:
- 嵌套UDFS
- 使用标量UDF中的表格查找
如果您对另一个表的每一行使用此功能,则有一个光标,该光标在每个外行的UDF中的表格上迭代
甚至更好。现在,它的桌子价值并像视图一样扩展。
create function fnIsReportingTo (
@BossID int,
@EmployeeID int)
RETURNs table
AS
return (
select CAST(COUNT(*) AS bit) AS FooBar
from dbo.fnGetEmployeeHierarchy(@BossID)
where employeeID=@employeeID)
GO
不隶属于 dba.stackexchange