2017-09-28 102 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

不客气。 :) –