Considerando que temos uma tabela com registros que representam as áreas do site, organizados de forma hierárquica e uma área pode ser filha de outra área, teremos algo como:
| AreaID | AreaPaiID | Titulo | 
|---|---|---|
| 1 | NULL | Blog | 
| 2 | NULL | Site | 
| 3 | 1 | Desenvolvimento | 
| 4 | 3 | ASP.NET | 
A questão é:
Como fazer para exibir o caminho completo do registro da área 4 (/Blog/Desenvolvimento/ASP.NET) quando o registro for retornado do banco de dados?
Um sugestão para resolver esse problema, é criar uma fuction recursiva que obtém o caminho de cada área e adicionar a chamada à essa function em um campo calculado na tabela.
O código da function é o seguinte:
CREATE FUNCTION [dbo].[ObtemCaminhoCompletoArea]
(
	@areaID INT,
	@separador VARCHAR(MAX),
	@nivel INT
)
RETURNS VARCHAR(MAX)
AS
BEGIN
	DECLARE @areaPaiID INT
	DECLARE @titulo VARCHAR(200)
	DECLARE @ret VARCHAR(MAX)
	SELECT
		@areaPaiID = AreaPaiID,
		@titulo = titulo
	FROM
		Area (NOLOCK)
	WHERE
		Area.AreaID = @areaID
	SET @ret = ''
	IF (@nivel <= 1)
		SET @ret = @titulo + @separador
	IF (@areaPaiID IS NULL)
		SET @ret = @ret + @titulo
	ELSE
		SET @ret = @ret + dbo.ObtemCaminhoCompletoArea(@areaPaiID, @separador, @nivel + 1) + @separador + @titulo
	RETURN @ret
END
GODica: Dá para alterar essa function para fazer esse select recursivo utilizando o comando WITH
E adicione uma coluna calculada na tabela, chamando essa function:
ALTER TABLE Area ADD CaminhoCompleto AS (dbo.ObtemCaminhoCompletoArea(AreaID,'\', null))Agora, ao selecionar os registros da tabela:
select * from AreaNa nova coluna, é exibido o caminho de cada área:
| AreaID | AreaPaiID | Titulo | CaminhoCompleto | 
|---|---|---|---|
| 1 | NULL | Blog | Blog | 
| 2 | NULL | Site | Site | 
| 3 | 1 | Desenvolvimento | Blog/Desenvolvimento | 
| 4 | 3 | ASP.NET | Blog/Desenvolvimento/ASP.NET |