У меня есть самосвязывающаяся таблица, в которой записывается одна запись для каждого «шага» в процессе (Step.ParentStepId - это внешний ключ для Step.StepId):
CREATE TABLE [dbo].[Step](
[StepId] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[Description] [text] NULL,
[Sequence] [int] NULL,
[ParentStepId] [int] NULL,
CONSTRAINT [PK_Step] PRIMARY KEY CLUSTERED
(
[StepId] ASC
)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
ALTER TABLE [dbo].[Step] WITH CHECK ADD CONSTRAINT [FK_Step_Step] FOREIGN KEY([ParentStepId])
REFERENCES [dbo].[Step] ([StepId])
Я бы хотелнаписать запрос, чтобы вернуть все шаги, где данный StepId является родителем (на любом уровне).
В Oracle для этого было несколько классных расширений SQL.Как это можно сделать в T-SQL, SQL 2008, R2?
Вот моя попытка.Помогите мне, пожалуйста, рекурсия слишком часто ранит мою голову.
DECLARE @StepId INT = 3
WITH cteRecursion
AS (SELECT
Stepid
,1 AS Level
FROM
Step
WHERE
StepId = @StepId
UNION ALL
SELECT
t.StepId
,c.Level + 1
FROM
Step t
INNER JOIN cteRecursion c
ON t.ParentStepId = c.StepId
)
SELECT
StepId,Level
FROM
cteRecursion
ORDER BY
Level,
StepId;
при запуске:
Сообщение 319, Уровень 15, Состояние 1, Строка 3
Неверный синтаксис рядом сКлючевое слово «с».Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен заканчиваться точкой с запятой.