передача нулевого значения в CTE для получения всех записей по умолчанию? - PullRequest
0 голосов
/ 13 декабря 2010

У меня CTE в качестве UDF, и я пытаюсь заставить его принять значение по умолчанию ничего, в случае, если возвращаемый результат должен быть всем

я хочу назвать его по умолчанию следующим образом:

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    
)  

как мне заставить его работать так?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2010
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    
)  
0 голосов
/ 13 декабря 2010

Попробуйте это в UDF

WHERE AMRSNTID = ISNULL(@AMRSNTID, AMRSNTID)

И назови это так

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

Изменить: не видя ваших данных или того, как выглядит иерархия, вам нужно добавить предложение OPTION Если он работает вечно, у вас есть круговая ссылка где-то

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

Примечание: вы не можете иметь ВАРИАНТ внутри UDF

Edit2: моя ошибка извините. Вы должны начать с сотрудников, у которых нет менеджера (то есть начать сверху)

Что-то вроде

WHERE
    (@AMRSNTID IS NOT NULL AND AMRSNTID = @AMRSNTID)
    OR
    (@AMRSNTID IS NULL AND ManagerAMRSNTID IS NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...