2017-09-28 53 views
1
Create Table Employees 
(
    Employee varchar(10), 
    Manager varchar(10) 
); 

Insert into Employees 
values 
('Charlie',null), 
('Peter','James'), 
('Elai',null), 
('Graham','Emanuel'), 
('Amanda','Charlie'), 
('Sen','Graham'), 
('Emanuel',null), 
('James','Amanda'), 
('Elai',null), 
('Victor','Elai'); 

上面的「Employees」表包含員工和員工的經理姓名。當試圖使用下面的函數檢索僱員的逗號分隔層次結構時,結果始終爲空。SQL遞歸udf總是返回null

例如:
僱員'Victor',層次/結果應該是"Victor, Elai"

任何人都可以指出我在UDF下面做錯了什麼。

Create Function EmployeeHierarchy(@employeeName varchar(20)) 
Returns varchar(100) 
AS 
Begin 
    Declare @commaSeparatedHierarchy varchar(100); 
    Declare @manager varchar(20); 

    if(@employeeName is not null) 
    Begin  
     Select @manager=Manager from Employees where [email protected]; 
     Set @commaSeparatedHierarchy=dbo.EmployeeHierarchy(@manager)+','[email protected];  
    End 

    return @commaSeparatedHierarchy; 
End; 
+1

加1爲測試數據 – TheGameiswar

回答

2

首先&最重要的是,你不想創建這個作爲一個標量函數。他們的表現是可怕的,你創建的任何udf都應該創建爲內聯表值函數。以下應該做你在找什麼...

-- the test data... 
USE tempdb; 
GO 
IF OBJECT_ID('tempdb.dbo.Employee', 'U') IS NOT NULL 
DROP TABLE dbo.Employee; 

CREATE TABLE dbo.Employee ( 
    Employee varchar(10), 
    Manager varchar(10) 
    ); 
INSERT dbo.Employee (Employee, Manager) VALUES 
    ('Charlie',null), 
    ('Peter','James'), 
    ('Elai',null), 
    ('Graham','Emanuel'), 
    ('Amanda','Charlie'), 
    ('Sen','Graham'), 
    ('Emanuel',null), 
    ('James','Amanda'), 
    ('Elai',null), 
    ('Victor','Elai'); 

SELECT * FROM dbo.Employee e; 

iTVF代碼...

CREATE FUNCTION dbo.EmployeeHierarchy 
(
    @employeeName varchar(20) 
) 
RETURNS TABLE WITH SCHEMABINDING AS 
RETURN 
    WITH 
     cte_Recur AS (
      SELECT 
       CSH = CAST(CONCAT(e.Employee, ', ' + e.Manager) AS VARCHAR(1000)), 
       e.Manager, 
       NodeLevel = 1 
      FROM 
       dbo.Employee e 
      WHERE 
       e.Employee = @employeeName 
      UNION ALL 
      SELECT 
       CSH = CAST(CONCAT(r.CSH, ', ' + e.Manager) AS VARCHAR(1000)), 
       e.Manager, 
       NodeLevel = r.NodeLevel + 1 
      FROM 
       dbo.Employee e 
       JOIN cte_Recur r 
        ON e.Employee = r.Manager 
      WHERE 
       e.Manager IS NOT NULL 
      ) 
    SELECT 
     commaSeparatedHierarchy = MAX(r.CSH) 
    FROM 
     cte_Recur r; 
GO 

樣品執行...

SELECT 
    eh.commaSeparatedHierarchy 
FROM 
    dbo.EmployeeHierarchy('peter') eh; 

...和結果...

commaSeparatedHierarchy 
------------------------------ 
Peter, James, Amanda, Charlie 
+0

謝謝你,傑森。 – user350591

+0

不客氣。 :) –