Sql CTE和闭合分号

Sql CTE和闭合分号,sql,tsql,common-table-expression,Sql,Tsql,Common Table Expression,我正在尝试编写一个递归CTE,它引用在它之前编写的另一个CTE 第一个cte节点在编写递归的层次结构之前,我用分号关闭了它cte: WITH nodes(node, node_name, parent, parent_name) AS ( SELECT Grp.PermissionGroupID as node, Grp.GroupName as node_name, GrpLink.ParentPermissionGroupI

我正在尝试编写一个递归CTE,它引用在它之前编写的另一个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,15级,状态1,第17行“;”附近的语法不正确

删除分号时,会出现以下错误:

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

Msg 319,15级,状态1,第19行靠近 关键字“with”如果此语句是公共表表达式,则 xmlnamespaces子句或更改跟踪上下文子句,前面的 语句必须以分号结尾


…我不经常编写CTE(更不用说递归CTE),所以我不太确定如何解决与
的明显冲突位置。

一个
CTE
只需要一个
子句。只需在前面的
CTE
末尾添加逗号,然后再加上CTE名称,即可创建
stacked 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)

您只能在语句末尾使用结束分号。所有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语句必须使用分号终止)