2011-10-17 3 views
1

J'ai besoin d'écrire une procédure stockée qui prendra une chaîne pour rechercher une structure arborescente et effectuer un jeu de résultats récursif. Tout d'abord, voici la table:Procédure stockée pour générer un jeu de résultats à partir d'une structure arborescente?

CREATE TABLE [dbo].[WorkAreas] (
    [Id] uniqueidentifier DEFAULT newid() NOT NULL, 
    [Name] nvarchar(max) COLLATE Latin1_General_CI_AS NULL, 
    [ParentWorkAreaId] uniqueidentifier NULL, 
    CONSTRAINT [PK__WorkArea__3214EC073FD07829] PRIMARY KEY CLUSTERED ([Id]), 
    CONSTRAINT [WorkArea_ParentWorkArea] FOREIGN KEY ([ParentWorkAreaId]) 
    REFERENCES [dbo].[WorkAreas] ([Id]) 
    ON UPDATE NO ACTION 
    ON DELETE NO ACTION, 

) 

Je Voudrais la procédure stockée pour produire les résultats comme celui-ci:

Work Area 1 - Child Of Work Area 1 - Child Child Of Work Area 1 

Donc, si cela était des données réelles, il peut ressembler à ceci:

Top Floor - Room 7 - Left Wall 
Top Floor - Room 9 - Ceiling 

la procédure stockée prendrait un paramètre: @SearchTerm varchar (255)

le terme de recherche serait Regardez les résultats et effectuez une requête "contient". Donc, si nous passions dans la "salle 9", le résultat devrait être l'exemple de la salle 9, ou si seulement le mot "salle" était passé, nous verrions les deux résultats.

Je ne suis pas sûr comment construire le SP pour construire récursivement les résultats.

+1

Jetez un oeil à cette question presque identique: http://stackoverflow.com/questions/4032192/printing-tree- avec-sql-cte –

+0

Parfait MERCI! – DDiVita

Répondre

0

Vous feriez quelque chose comme ceci:

select w1.name, w2.name, w3.name 
from workareas w1 
inner join workareas w2 
on w1.parentworkareaid = w2.id 
inner join workareas w3 
on w2.parentworkareaid = w3.id 
where contains(w3.name, @yourSearchString) 
+0

Cela suppose que j'ai seulement 3 niveaux, mais ce n'est pas le cas. C'était juste un exemple. – DDiVita

1

Commentaire de Cade Roux me conduire à ce que je avais besoin. Voici ce que j'ai fini avec:

;WITH ProjectWorkAreas (EntityId ,ParentIDs,DisplayText) 
AS 
(
SELECT Id,CAST(Id AS VARCHAR(1000)) ,CAST(Name AS VARCHAR(1000)) 
FROM WorkAreas 
WHERE ParentWorkAreaId IS NULL And ProjectId = @projectId 

UNION ALL 

SELECT Id, CAST(ParentIDs+','+ CAST(Id AS VARCHAR(100)) 
AS VARCHAR(1000)),CAST(DisplayText + ' - ' + Name AS VARCHAR(1000))  
FROM WorkAreas AS ChildAreas 
INNER JOIN ProjectWorkAreas 
ON ChildAreas.ParentWorkAreaId = ProjectWorkAreas.EntityId 
) 



SELECT * FROM ProjectWorkAreas Where DisplayText like '%' + @searchTerm + '%' 

j'ai ajouté le ProjectID au mélange

Questions connexes