Eu tenho uma tabela com 2 colunas, name e 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')
Eu quero escrever um UDF, que receberá um nome e retornará todos os nomes relacionados. Se a está relacionado com b e b está relacionado com c, isso significa que a está relacionado com c.
Portanto, o resultado esperado para o parâmetro 'a', 'b', 'c', 'd' deve ser o mesmo.
select * from my_func('a')
O resultado deve ser
result
------
a
b
c
d
E o resultado para
select * from my_func('e')
devemos ser
result
------
e
f
g
Você pode usar um CTE recursivo para isso, desde que não tenha mais de 100 relações (já que você não pode adicionar
MAXRECURSION
dentro da função, então você teria que aplicá-lo em qualquer consulta que faça referência à função - veja um exemplo aqui ).O primeiro passo é encontrar todos os pais sem pai, então usar isso como uma âncora para recursão.
Então você pode consultar:
Resultados:
Claro que é fácil quebrar isso com uma referência circular. Não faça isso.
A consulta (nos dois sentidos):
Resultado:
Como uma função com valor de tabela:
Teste
Resultado:
Teste 2
Resultado: