2016-10-24 2 views
2

Я пытаюсь написать рекурсивный CTE, который ссылается на другой CTE, написанный перед ним.CTE и закрывающие полуколоны

Первый КТР nodes Я закрыл-офф с запятой перед записью рекурсивной Hierarchy КТРА:

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 ';'.

Когда я удалить точку с запятой, я получить ошибки:

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 et only recursive), что часто, поэтому я не слишком уверен, как разрешить этот очевидный конфликт с размещением ;.

ответ

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) 
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 должен быть завершен с использованием двоеточия).

Смежные вопросы