自加入查询以查找节点语法问题的后代

时间:2011-10-06 18:55:02

标签: tsql sql-server-2008-r2

我有一个自连接表,记录进程中每个“Step”的一条记录(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;
运行时

  

Msg 319,Level 15,State 1,Line 3
  关键字'with'附近的语法不正确。如果这个陈述是   公用表表达式,xmlnamespaces子句或更改跟踪   context子句,前一个语句必须以a结尾   分号。

2 个答案:

答案 0 :(得分:2)

阅读精彩的错误消息!

它清楚地说:

关键字'with'附近的语法不正确。 如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则前一个语句必须以分号终止。

所以:用分号终止你以前的陈述,你应该没问题!

DECLARE @StepId INT = 3

; WITH cteRecursion
     AS (SELECT
             Stepid, 1 AS Level
         FROM
             Step
         WHERE
             StepId = @StepId
        .......

答案 1 :(得分:0)

你需要一个;在WITH之前或者你得到这个错误。