Объедините CTE «С» и «С XMLNAMESPACES ....» в SQL Server - PullRequest
31 голосов
/ 10 сентября 2010

Кто-нибудь сумел создать CTE в T-SQL SQL Server, который также включает в себя объявление 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

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

Сообщение 156, уровень 15, состояние 1, строка 2
Неверный синтаксис рядом с ключевым словом «WITH».
Сообщение 319, уровень 15, состояние 1, строка 2
Неправильный синтаксис рядом с ключевым словом «with».Если этот оператор является общим табличным выражением, предложением 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-й уровень, статe 1, строка 4
Неверный синтаксис рядом с ключевым словом «WITH».
Сообщение 319, Уровень 15, Состояние 1, строка 4
Неверный синтаксис рядом с ключевым словом «with».Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен заканчиваться точкой с запятой.
Сообщение 102, Уровень 15, Состояние 1, Строка 21
Неверный синтаксис рядом с ') '.

Так какого черта я делаю это ??

1 Ответ

48 голосов
/ 10 сентября 2010

Используйте запятую вместо второй 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 просто использовать запятую вместо ключевого слова.

...