Хранимая процедура для построения результирующего набора из древовидной структуры? - PullRequest
1 голос
/ 18 октября 2011

Мне нужно написать хранимую процедуру, которая будет принимать строку для поиска древовидной структуры и выполнения рекурсивного набора результатов. Во-первых, вот таблица:

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 для рекурсивного построения результатов.

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Комментарий Кейд Ру привел меня к тому, что мне было нужно.Вот что я закончил:

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

Я добавил ProjectId в смесь

0 голосов
/ 18 октября 2011

Вы бы сделали что-то вроде этого:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...