Sql-Server

為什麼我不能直接呼叫我的 UDF?為什麼我需要將其限定為 3 級深度?

  • November 10, 2016

我剛剛創建了一個 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

標量UDFS 必須使用模式進行限定。當然,除非它在不同的數據庫中,否則您不需要限定名稱的數據庫部分。

SELECT [dbo].[fnIsReportingTo] (50,1132)

在 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

引用自:https://dba.stackexchange.com/questions/1221