2010-09-10 24 views
27

¿Alguien ha logrado crear un CTE en SQL Server's T-SQL que también incluye una declaración WITH XMLNAMESPACES?Combine CTE "WITH" y "WITH XMLNAMESPACES ...." en SQL Server

Parece ambos WITH palabras clave insisten en ser el "primero en el lote de T-SQL", y que en realidad no funciona ....

Traté:

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' :-(t trabajo (errores de sintaxis)

Msg 156, nivel 15, estado 1, línea 2
sintaxis incorrecta cerca de la palabra clave 'con'.
Msg 319, nivel 15, estado 1, línea 2 Sintaxis incorrecta cerca de la palabra clave 'con'. Si esta instrucción es una expresión de tabla común , una cláusula xmlnamespaces o una cláusula de contexto de seguimiento , la instrucción anterior debe terminarse con un punto y coma .

así que traté anteponiendo la segunda WITH con un punto y coma:

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

y tiene esto:

Msg 102, nivel 15, estado 1, línea 2
sintaxis incorrecta cerca ';'

y luego he intentado poner el WITH XMLNAMESPACES en el 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 

y obtuve esto:

Msg 156, nivel 15, estado 1, línea 4
sintaxis incorrecta cerca la palabra clave 'CON'.
Msg 319, nivel 15, estado 1, línea 4
Sintaxis incorrecta cerca de palabra clave 'con'. Si esta instrucción es una expresión de tabla común , una cláusula xmlnamespaces o una cláusula de contexto de seguimiento , la instrucción anterior debe terminarse con un punto y coma .
Msg 102, nivel 15, estado 1, línea 21
Sintaxis incorrecta cerca de ')'.

Entonces, ¿cómo diablos hago esto?

Respuesta

42

Use una coma en lugar del segundo WITH, p. Ej.

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

Igual si quiere múltiples expresiones CTE. Solo necesita especificar WITH una vez, y luego todos los demás bloques WITH solo usan una coma en lugar de la palabra clave.

+2

Y 'XMLNAMESPACES' debe definirse primero, antes de cualquier' CTEs'. – Gabrielius