CTE和关闭半冒号

Mat*_*all 2 sql t-sql common-table-expression

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

第一CTE nodes我已经封闭了与分号写递归前HierarchyCTE:

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)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

消息102,级别15,状态1,行17'''附近的语法不正确.

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

消息156,级别15,状态1,行19关键字"WITH"附近的语法不正确.

消息319,级别15,状态1,行19关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句.

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

Pரத*_*ீப் 5

A 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)
Run Code Online (Sandbox Code Playgroud)