我有一个自连接表,记录进程中每个“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结尾 分号。
答案 0 :(得分:2)
阅读精彩的错误消息!
它清楚地说:
关键字'with'附近的语法不正确。 如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则前一个语句必须以分号终止。
所以:用分号终止你以前的陈述,你应该没问题!
DECLARE @StepId INT = 3
; WITH cteRecursion
AS (SELECT
Stepid, 1 AS Level
FROM
Step
WHERE
StepId = @StepId
.......
答案 1 :(得分:0)
你需要一个;在WITH之前或者你得到这个错误。