Id DependentId
----- ------------
2 5
5 8
8 6
6 7
7 NULL
3 10
10 15
17 NULL
15 NULL
我编写了一个函数,如果我们传递参数2,该函数将从上表返回7。
其他示例:如果参数值为3,则返回值为15。
如果输入参数为17,则返回值为17
功能:
ALTER FUNCTION dbo.getValue
(
@Id INT
)
RETURNS INT
AS
BEGIN
DECLARE @DependentId AS INT
WHILE (1 = 1)
BEGIN
SELECT @DependentId = DependentId FROM dbo.givenTable WHERE Id = @Id;
IF (@DependentId IS NOT NULL)
SET @Id = @DependentId
ELSE
BREAK;
END
RETURN @Id
END
GO
有没有不用循环就可以得到值的方法?
答案 0 :(得分:0)
为避免循环,可以使用Recursive CTE。 CTE的终止逻辑为WHERE DependentID is NULL
。
ALTER FUNCTION dbo.getValue
(
@Id INT
)
RETURNS INT
AS
BEGIN
DECLARE @result INT;
WITH RecursiveCTE
AS ( SELECT ID ,
dependentID ,
Id AS BaseDependentId
FROM givenTable
WHERE dependentID IS NULL
UNION ALL
SELECT T.id ,
T.DependentId ,
cte.BaseDependentId
FROM givenTable AS T
INNER JOIN RecursiveCTE cte ON T.DependentId = cte.id
)
SELECT @result = BaseDependentId
FROM RecursiveCTE
WHERE Id = @Id
RETURN @result
END
GO