2010-12-13 49 views
0

我有CTE作爲一個UDF,並試圖讓它採取什麼都沒有默認值的情況下返回的結果應該是一切。將null傳遞給CTE以獲取所有記錄作爲默認值?

我想稱呼其爲這樣的默認:

select * from fnGetEmployeeHierarchyByUsername 

我UDF/CTE是:

alter FUNCTION [dbo].[fnGetEmployeeHierarchyByUsername] 
(  
    @AMRSNTID varchar(100) = null 
)  
RETURNS TABLE  
AS  
RETURN  
( 
    WITH yourcte AS  
    ( 
    SELECT EmployeeId, ManagerAMRSNTID, ManagerID, AMRSNTID, FullName, 0 as depth--, Name  
    FROM Employees  
    WHERE AMRSNTID = @AMRSNTID 
    UNION ALL  
    SELECT e.EmployeeId, e.ManagerAMRSNTID, e.ManagerID, e.AMRSNTID, e.FullName, y.depth+1 as depth--, e.Name  
    FROM Employees e  
    JOIN yourcte y ON e.ManagerAMRSNTID = y.AMRSNTID 
)  
SELECT EmployeeId, ManagerID, AMRSNTID, FullName, depth--, Name  
FROM yourcte  
) 

我怎樣才能得到它這樣的工作嗎?

回答

0

在UDF

WHERE AMRSNTID = ISNULL(@AMRSNTID, AMRSNTID) 

試試這個,把它叫做從而

select * from fnGetEmployeeHierarchyByUsername(DEFAULT) 
--or 
select * from fnGetEmployeeHierarchyByUsername(NULL) 

編輯:沒有看到你的數據或層次的樣子,你需要添加一個OPTION子句 如果永遠運行,你有一個圓形鏈接某處

select * from fnGetEmployeeHierarchyByUsername(DEFAULT) OPTION (MAXRECURSION 0) 

注意:你可以沒有UDF內的OPTION

Edit2:我的錯誤抱歉。你必須在誰沒有經理的員工開始(即,在頂部開始)

喜歡的東西

WHERE 
    (@AMRSNTID IS NOT NULL AND AMRSNTID = @AMRSNTID) 
    OR 
    (@AMRSNTID IS NULL AND ManagerAMRSNTID IS NULL) 
+0

我得到這個錯誤:終止聲明。報表完成前,最大遞歸100已用盡。 – kacalapy 2010-12-13 18:45:16

+0

它似乎永遠運行。自引用表Employees擁有1000條記錄,可創建1000個節點的樹。添加OPTION(MAXRECURSION 0)的結果在25秒後停止時產生了500,000條記錄。 – kacalapy 2010-12-13 18:58:13

+0

@kacalapy:然後你有一個遞歸。 EmpA到EmpB EmpC到EmpA等 – gbn 2010-12-13 19:26:08

0
alter FUNCTION [dbo].[fnGetEmployeeHierarchyByUsername] 
(  
    @AMRSNTID varchar(100) = null 
)  
RETURNS TABLE  
AS  
RETURN  
( 
    WITH yourcte AS  
    ( 
    SELECT EmployeeId, ManagerAMRSNTID, ManagerID, AMRSNTID, FullName, 0 as depth--, Name  
    FROM Employees  
    WHERE (AMRSNTID = @AMRSNTID) or (@AMRSNTID is null and managerID is null) 
    UNION ALL  
    SELECT e.EmployeeId, e.ManagerAMRSNTID, e.ManagerID, e.AMRSNTID, e.FullName, y.depth+1 as depth--, e.Name  
    FROM Employees e  
    JOIN yourcte y ON e.ManagerAMRSNTID = y.AMRSNTID 
)  

SELECT EmployeeId, ManagerID, AMRSNTID, FullName, depth--, Name  
FROM yourcte  
) 
相關問題