2012-02-06 26 views
7

Msg 1086, nivel 15, estado 1, línea 20 La cláusula FOR XML no es válida en vistas, funciones en línea, tablas derivadas y subconsultas cuando contienen un operador establecido. Para evitarlo, ajuste el SELECT que contiene un operador de conjunto utilizando la sintaxis de tabla derivada y aplique FOR XML encima de él.Uso de UNION ALL en STUFF/ruta XML

me sale este error cuando funciono esto:

SELECT 
    STUFF((
    SELECT 1 
    UNION ALL 
    SELECT 2 
    FOR XML PATH('') 
    ),1,0,'') [COLUMN] 

funciona bien cuando corro esto (sin UNION ALL)

SELECT 
    STUFF((
    SELECT 1 
    FOR XML PATH('') 
    ),1,0,'') [COLUMN] 

Cualquier sugerencia por qué UNION ALL no funciona, o cómo para que funcione dentro del STUFF()?

Respuesta

13

Hay una solución simple para eso, debe ajustar su consulta de unión (o cualquier tabla derivada para ese asunto) con otra selección. Para ello, y luego continuar con la sintaxis normal:

select * from 
(
SELECT 1 as I 
UNION ALL 
SELECT 2 as J 
) as K 

Algo como esto es lo que estás buscando:

SELECT STUFF((
    select * from(

    SELECT * from dbo.Table1 as I 
    UNION ALL 
    SELECT * from dbo.Table2 as j 
    ) as k 
    FOR XML PATH('') 
    ),1,0,'') 

he comprobado y funciona sin problemas

+1

que parece funcionar, gracias! –

+0

¿Para qué son los alias 'I' y' J'? – alzaimar

+1

Creo que no son necesarios, los puse por las dudas. Si los pone, puede consultar la tabla dbo.Table1 como j en futuras referencias. Sin embargo, se NECESITA la k porque si no estuviera allí, no habría forma de referirse a las columnas de esa subconsulta. – Gaspa79