Подтвердить что ты не робот

Объедините CTE "WITH" и "WITH XMLNAMESPACES...." в SQL Server

Кто-нибудь смог создать CTE в SQL Server T-SQL, который также включает объявление WITH XMLNAMESPACES?

Кажется, что ключевые слова WITH настаивают на том, чтобы быть "первым в партии T-SQL", и это не работает.

Я пробовал:

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
WITH CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery

Не работает:-( (синтаксические ошибки)

Msg 156, уровень 15, состояние 1, строка 2
Неверный синтаксис рядом с ключевым словом "WITH".
Msg 319, уровень 15, состояние 1, строка 2
Неправильный синтаксис рядом с ключевое слово 'с'. Если это утверждение является общее табличное выражение, Предложение xmlnamespaces или изменение контекст контекста отслеживания, предыдущий должно быть прекращено с помощью точка с запятой.

Поэтому я попытался добавить второй WITH с точкой с запятой:

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
;WITH CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery

и получил следующее:

Msg 102, уровень 15, состояние 1, строка 2
Неверный синтаксис рядом с ';'.

а затем я попытался поместить WITH XMLNAMESPACES в CTE:

WITH CTEQuery AS
(
   WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
   SELECT (list of fields)
      FROM dbo.MyTable
      WHERE (conditions)
)
SELECT * FROM CTEQuery

и получил следующее:

Msg 156, уровень 15, состояние 1, строка 4
Неправильный синтаксис рядом с ключевым словом 'С'.
Msg 319, уровень 15, состояние 1, строка 4
Неправильный синтаксис рядом с ключевое слово 'с'. Если это утверждение является общее табличное выражение, Предложение xmlnamespaces или изменение контекст контекста отслеживания, предыдущий должно быть прекращено с помощью точка с запятой.
Msg 102, уровень 15, состояние 1, строка 21
Неверный синтаксис рядом с ')'.

Итак, как я это делаю?

4b9b3361

Ответ 1

Используйте запятую вместо второго WITH, например

WITH XMLNAMESPACES('http://schemas.myself.com/SomeSchema' as ns)
,CTEQuery AS
(
SELECT (list of fields)
    FROM dbo.MyTable
    WHERE (conditions)
)
SELECT * FROM CTEQuery

То же самое, если вы хотите использовать несколько выражений CTE. Вам нужно только указать WITH один раз, а затем все остальные блоки WITH просто используют запятую вместо ключевого слова.