2011-10-17 195 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)

搜索条件将查看结果并执行“包含”查询。

因此,如果我们在“9房间”,通过了结果应该拿出室9例如,或者如果获得通过,在短短的一句话“房间”,我们会看到两个结果。

我不知道如何构建SP递归构建的结果。

+1

看一看这几乎相同的问题: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

凯德空肠Roux的评论使我我需要的东西。以下是我结束了:

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

我加入专案编号进来