2008-11-20 10 views
43

MS SQL tiene una solución conveniente para la concatenación de un valor de columna de múltiples filas en un valor:¿Cómo elegir el nombre de columna devuelto en una consulta SELECT FOR XML?

SELECT col1 
FROM table1 
WHERE col2 = 'x' 
ORDER by col3 
FOR XML path('') 

y que devuelve un buen conjunto de registros:

XML_F52E2B61-18A1-11d1-B105-00805F49916B          
---------------------------------------- 
<col1>Foo</col1><col1>Bar</col1> 

sólo el nombre de la columna en el conjunto de registros devuelto es bastante desagradable!

El nombre de columna parece incluir elementos aleatorios (o un GUID), y por lo tanto soy reacio a usarlo en mi aplicación (diferentes instancias o diferentes servidores pueden tener otro GUID). Desafortunadamente no puedo usar * para seleccionar el valor, y debido a las restricciones en la aplicación existente no puedo repetir las columnas devueltas, ya sea ...

¿Hay alguna manera de forzar el nombre de columna en el conjunto de registros devuelto a algo más ¿sensato?

Respuesta

65

Eso debería hacer:

select(
SELECT col1 
FROM table1 
WHERE col2 = 'x' 
ORDER by col3 
FOR XML path('') 
) as myName 

No es bonita, pero debe dar el resultado que necesita

+0

debido a su respuesta, he encontrado solución para mi problema ... muchas gracias! –

+0

¡Sintaxis extraña pero funciona! –

2

procedimiento almacenado

declare @requestResultXML xml 

set @requestResultXML = 
      (
       SELECT 'NPOIT-1.0' AS '@Interface', 
       (
        select 'Query'  as '@Type', 
          'GetBill' as '@Query', 
          'True'  as '@CompressResult' 
         FOR XML PATH('Head'), TYPE 
       ), 
       (
        select @pin  as '@PIN', 
          @period  as '@Period', 
          @number  as '@Number', 
          @barcode as '@Barcode' 
         FOR XML PATH('QueryParams'), TYPE 
       ) as Data 

       FOR XML PATH('DataExchangeModule')    
      ) 

select @requestResultXML as GetBillRequest 
+3

¿Deseas comentar tu código? ¿Qué se agrega a la respuesta actualmente aceptada con 12 votos ascendentes y un código simple? – Yaroslav

+0

En realidad, hay una diferencia sutil. Notará que Vadym está devolviendo una variable local de tipo "Xml". En la respuesta aceptada, el resultado es (creo) una cadena. Sé que no parece que debería ser, pero ciertamente no es del tipo "Xml". –

+0

Subí debido a esa sutileza. – rainabba

10

Prueba esto ...

select 
(
    select '@greeting' = 'hello', '@where' = 'there', '@who' = 'world' 
    for xml path ('salutation'), type 
) as 'MyName' 

Nota: si omite el "tipo" después del "para xml", obtienes (creo) una cadena.

+2

Sí. TYPE es obligatorio si desea conservar el tipo de datos xml para la columna resultante. –

0

Para la generación xml explícito - con los sindicatos que necesita para envolver los resultados una vez más (Como resultado de bonificación como XML):

SELECT 
    CAST( 
     (
      SELECT 
       * 
      FROM (
       SELECT 
        1 AS Tag 
        ,NULL AS Parent 
        ... 
       UNION ALL 
       SELECT ... 
       FOR XML EXPLICIT 
      ) 
     ) as XML) as [MyName] 
0
DECLARE @XmlData XML; 

SET @XmlData = (
     SELECT * 
     FROM [dbo].[TABLE1] 
     FOR XML PATH('ChildNodeDetailsResponse') 
      ,ROOT('ParentNode') 
     ) 

SELECT @XmlData AS Result 
+0

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y/o cómo responde este código a la pregunta mejora su valor a largo plazo. – adiga

+0

Si no desea ningún nodo xml, consulte el siguiente código – Mahadev

+0

[Editar] (https://stackoverflow.com/posts/46972316/edit) la respuesta y agregue algunos comentarios adicionales sobre por qué esto funcionaría. – adiga

0
DECLARE @XmlData XML; 
SET @XmlData =(SELECT * FROM [dbo].[Users] ORDER by UserName FOR XML path('')) 
SELECT @XmlData AS Result 
Cuestiones relacionadas