2017-09-28 6 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'); 

위의 "직원"테이블에는 직원 및 관리자의 관리자 이름이 포함되어 있습니다. 아래 함수를 사용하여 직원의 쉼표로 구분 된 계층 구조를 검색하려고하면 결과는 항상 null입니다. 예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

먼저, 스칼라 함수로이를 만들려하지 마십시오. 그들의 성능은 당신이 만드는 끔찍한 것이고, 인라인 테이블 값 함수로 생성되어야합니다. 다음은

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; 

... 결과 ... 당신이 ...

-- 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 코드를 찾고 어떻게해야 ...

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

감사합니다. Jason. – user350591

+0

반갑습니다. :) –