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

У меня есть самосвязывающаяся таблица, в которой записывается одна запись для каждого «шага» в процессе (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 или предложением контекста отслеживания изменений, предыдущий оператор должен заканчиваться точкой с запятой.

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Прочитайте невероятное сообщение об ошибке!

В нем четко сказано:

Неправильный синтаксис рядом с ключевым словом «с». Если этот оператор является общим табличным выражением , предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен заканчиваться точкой с запятой .

Итак: завершите свое предыдущее утверждение точкой с запятой, и все будет в порядке!

DECLARE @StepId INT = 3

; WITH cteRecursion
     AS (SELECT
             Stepid, 1 AS Level
         FROM
             Step
         WHERE
             StepId = @StepId
        .......
0 голосов
/ 06 октября 2011

Тебе нужен; до WITH, иначе вы получите эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...