CTE和关闭半冒号

时间:2016-10-24 15:32:40

标签: sql tsql common-table-expression

我正在尝试编写一个递归CTE,它引用了之前写的另一个CTE。

第一个cte nodes在编写递归Hierarchy 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'''附近的语法不正确。

当我删除分号时,我收到错误:

  

消息156,级别15,状态1,行19关键字附近的语法不正确   “用”。

     

Msg 319,Level 15,State 1,Line 19附近的语法不正确   关键字'with'。 如果此语句是公用表表达式,则为   xmlnamespaces子句或更改跟踪上下文子句,以前的子句   声明必须以分号终止。

...我不经常写CTE(更不用说递归)了,所以我不太清楚如何解决与;位置的明显冲突。

2 个答案:

答案 0 :(得分:5)

CTE只需要一个WITH子句。您只需在上一个stacked CTE末尾添加逗号后跟CTE名称

即可创建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)

答案 1 :(得分:2)

您只能在语句末尾使用结束分号。所有CTE都形成一个单一的陈述。在单个语句中使用多个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语句必须使用分号终止)。