2011-10-17 10 views
1

構造体のようなツリーを検索し、再帰的な結果セットを実行するために文字列を取り込むストアドプロシージャを記述する必要があります。まず、ここでのテーブルには、次のとおりです。ツリー構造から結果セットを構築するためのストアドプロシージャ?

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, 

) 

私はこのような結果を出力するストアドプロシージャをたいと思います:

:これは実際のデータであれば

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

だから、それはこのように見えるかもしれません

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

ストアドプロシージャは、パラメータに取る:@SearchTermのVARCHAR(255)

検索用語を希望結果を見て、「contains」クエリを実行します。

"Room 9"に​​合格した場合、結果はRoom 9の例になるはずです。そうでない場合、 "Room"という単語だけが渡された場合、両方の結果が表示されます。

私は結果を再帰的に構築するためにSPを構築する方法がわかりません。

+1

にPROJECTIDを追加しました。このほとんど同じ質問を見て:http://stackoverflow.com/questions/4032192/printing-tree- with-sql-cte –

+0

パーフェクト感謝! – DDiVita

答えて

0

あなたはこのようなものだろう:

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

それは私が3つのレベルしかないと仮定しますが、そうではありません。それはほんの一例でした。 – DDiVita

1

ケイドルーさんのコメントは私が必要なものに私をリードします。ここに私がしてしまったものです:

;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 + '%' 

私はミックス