为什么我不能直接调用我的 UDF?为什么我需要将它限定为 3 个级别?

kac*_*apy 7 sql-server-2005 sql-server syntax functions

我刚刚创建了一个 UDF 并对其进行了测试,我发现只有在使用此语法时才有效

SELECT [PMIS].[dbo].[fnIsReportingTo] (50,1132)
Run Code Online (Sandbox Code Playgroud)

我期待它像这样工作:

select * from fnIsReportingTo (50,1132)
Run Code Online (Sandbox Code Playgroud)

或者

select fnIsReportingTo (50,1132)
Run Code Online (Sandbox Code Playgroud)

这是我的创建 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
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 8

标量UDFS 必须用架构限定。当然,除非它在不同的数据库中,否则您不需要限定名称的数据库部分。

SELECT [dbo].[fnIsReportingTo] (50,1132)
Run Code Online (Sandbox Code Playgroud)

在 FROM 子句中,您只能使用表值函数

请参阅MSDN 中的“函数类型”

编辑:作为观察,我倾向于避免:

  • 嵌套 UDF 这个
  • 在标量 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
Run Code Online (Sandbox Code Playgroud)