2016-10-24 2 views
2

私は前に書かれた別のCTEを参照する再帰的なCTEを書こうとしています。CTEとセミコロンを閉じる

WITH nodes(node, node_name, parent, parent_name) AS 
(
    SELECT  
     Grp.PermissionGroupID as node, 
     Grp.GroupName as node_name, 
     GrpLink.ParentPermissionGroupID as parent, 
     ParentGrp.GroupName as parent_name 
    FROM _CCC_Permission_Group Grp 
    LEFT JOIN _CCC_Permission_GroupGroup GrpLink 
    on   Grp.PermissionGroupID = GrpLink.ChildPermissionGroupID 
    LEFT JOIN _CCC_Permission_Group ParentGrp 
    on   GrpLink.ParentPermissionGroupID = ParentGrp.PermissionGroupID 

); 

WITH Hierarchy(node, node_name, depth, parent, parent_name) 
AS 
(
    SELECT  
     node, 
     node_name, 
     0, 
     parent, 
     parent_name 
    FROM nodes as FirstDepth 
    WHERE parent IS NULL 

    UNION ALL 

    SELECT 
     NextDepth.node, 
     NextDepth.node_name, 
     Parent.depth + 1, 
     Parent.parent, 
     Parent.parent_name    
    FROM nodes as NextDepth 
    INNER JOIN Hierarchy as Parent 
    on   NextDepth.parent = Parent.parent 

) 

SELECT  * 
FROM  Hierarchy 
OPTION  (MAXRECURSION 32767) 

私はエラーを取得する:

Msg 102, Level 15, State 1, Line 17 Incorrect syntax near ';'.

私は、セミコロンを削除すると、私は閉じてオフしましセミコロンで再帰Hierarchy CTEを書き込む前に

最初のCTE nodesエラーを取得してください:

Msg 156, Level 15, State 1, Line 19 Incorrect syntax near the keyword 'WITH'.

Msg 319, Level 15, State 1, Line 19 Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

...私はCTEを書いていません(lそれだけで再帰的なもの)、しばしば、;プレースメントとのこの明らかな競合を解決する方法があまりにもわかりません。

答えて

5

CTEは、1つだけWITH節が必要です。あなただけのCTE名

;WITH nodes(node, node_name, parent, parent_name) AS 
(
.... 
),Hierarchy(node, node_name, depth, parent, parent_name) 
AS 
(
.. 
) 
SELECT * 
FROM Hierarchy 
OPTION (MAXRECURSION 32767) 
2

あなたが唯一の文の最後に閉じセミコロンを使用することで、その後、前CTEの最後にカンマを追加することにより、stacked CTEを作成することができます。すべてのCTEが単一のステートメントを形成します。 1つのステートメントで複数のCTEを使用する場合は、各CTEをカンマで区切ります。

WITH nodes(node, node_name, parent, parent_name) AS 
    ... 
), Hierarchy(node, node_name, depth, parent, parent_name) AS (
    ... 
) 
SELECT ... 
OPTION (MAXRECURSION 32767); 

最後にセミコロンがあることに注意してください。将来的にはより多くの声明がそれを必要とするようにこれを含める習慣に入るべきです(例えば、MERGEステートメントはセミコロンで終了させる必要があります)。

関連する問題