2010-09-10 6 views
27

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

кажется оба 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 

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

Msg 156, Level 15, State 1, Line 2
Неправильный синтаксис около ключевого слова 'с'.
Msg 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 в КТР:

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, Level 15, State 1, Line 4
Неправильный синтаксис около ключевое слово 'WITH'.
Msg 319, Level 15, State 1, Line 4
Неправильный синтаксис около ключевого слова 'с'. Если этот оператор является общим табличным выражением , предложение xmlnamespaces или изменение фразы контекста отслеживания, предыдущий оператор должен быть прерван точкой с запятой .
Msg 102, Level 15, State 1, Line 21
Неверный синтаксис рядом с ')'.

Так как, черт возьми, я это делаю ??

ответ

42

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

+2

И 'XMLNAMESPACES' должны быть определены сначала перед любыми« CTE ». – Gabrielius