SQL-рекурсивный udf всегда возвращает null

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'); 

В таблице «Сотрудники» указано имя менеджера и сотрудника. При попытке получить разделенную запятыми иерархию сотрудника с использованием функции ниже результат всегда равен нулю.

например :
сотрудник '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; 

Прежде всего, вы НЕ хотите создавать это как скалярную функцию. Их производительность ужасна, если вы создаете ее, она должна быть создана как встроенная функция, учитывающая ценность таблицы. Следующее должно делать то, что вы ищете …

 -- 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 
  • Рекурсивный результат CTE бесконечен
  • Что мне делать, когда я перехожу через maxrecursion с помощью CTE?
  • Рекурсивная логика SQL
  • Рекурсивная спецификация CTE
  • Sql Server CTE родительский рекурсивный ребенок
  • SQL Server - рекурсивный CTE от листа до корня (обратный)
  • SQL Server: как выполнить UPDATE из рекурсивной функции?
  • Пройти родительское / дочернее дерево с рекурсивным CTE?
  • Рекурсивные записи SQL: как я могу свернуть до «только одного уровня»?
  • рекурсивное общее табличное выражение в SQL Server
  • Как вы получаете последнюю запись, сгенерированную в рекурсивном CTE?
  • Давайте будем гением компьютера.