【问题标题】:CTE and closing semi colonsCTE 和结束分号
【发布时间】:2016-10-24 15:32:39
【问题描述】:

我正在尝试编写一个递归 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)

我得到错误:

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

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

Msg 156, Level 15, State 1, Line 19 关键字附近的语法不正确 '和'。

消息 319,级别 15,状态 1,第 19 行 关键字“与”。 如果此语句是公用表表达式,则 xmlnamespaces 子句或更改跟踪上下文子句,上一个 语句必须以分号结束

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

【问题讨论】:

    标签: sql tsql common-table-expression


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案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 语句必须使用分号终止)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-11
        • 1970-01-01
        • 2016-11-25
        • 2018-01-06
        • 1970-01-01
        • 2011-03-19
        • 2021-02-02
        • 1970-01-01
        相关资源
        最近更新 更多