2011-10-06 16 views
1

我有一個自連接表,它記錄了進程中每個「步驟」的一條記錄(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

閱讀神話般的錯誤信息!

上面清清楚楚地寫着:

'與' 關鍵字附近有語法錯誤。 如果此語句是通用表表達式,則xmlnamespaces子句或變更跟蹤上下文子句必須以分號終止上一個語句。

因此:用分號終止以前的語句,你應該沒問題!

DECLARE @StepId INT = 3 

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

啊。我想我對SQL很害怕,很快就被打包了。我從來沒有超過「關鍵字附近的語法錯誤」,並且使用「。」。奇怪語法!謝謝。在T-SQL中有沒有一種方法可以像oracle中那樣以縮進文本「樹」格式顯示ourput?這聽起來像另一個SO問題,答案可能是「不」。 – ChadD

+0

@chad:不,SQL Server會*給你提供數據 - 準備/呈現它,是另一項工作(而不是SQL Server的) –

+0

我同意。我很驚訝oracle有這樣一個格式化樹輸出的函數。然而......這對於快速調試結果來說非常方便! – ChadD

0

你需要一個;在WITH之前或者你得到這個錯誤。