我有一个包含 2 列的表,name 和 related_name。
CREATE TABLE _test(
[name] NVARCHAR(50),
related_name NVARCHAR(50)
)
GO
INSERT INTO dbo._test
([name], related_name)
VALUES
('a', 'b'),
('b', 'c'),
('c', 'd'),
('e', 'f'),
('f', 'g')
我想写一个 UDF,它将获取一个名称并将返回所有相关的名称。如果a与b相关,b与c相关,这意味着a与c相关。
因此参数 'a'、'b'、'c'、'd' 的预期结果必须相同。
select * from my_func('a')
结果必须是
result
------
a
b
c
d
结果是
select * from my_func('e')
一定是
result
------
e
f
g
您可以为此使用递归 CTE,前提是您没有超过 100 个关系(因为您不能
MAXRECURSION
在函数内部添加,所以您必须将它应用于任何引用该函数的查询 -请参见此处的示例).第一步是找到所有无父母的父母,然后将其用作递归的锚点。
然后你可以查询:
结果:
当然,用循环引用很容易打破这一点。不要那样做。
查询(双向):
结果:
作为表值函数:
测试
结果:
测试 2
结果: