2008-11-20 2 views
43

MS SQL a une solution pratique pour concaténer une valeur de colonne de plusieurs lignes en une seule valeur:Comment choisir le nom de colonne renvoyé dans une requête SELECT FOR XML?

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

et qui retourne une belle recordset:

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

seul le nom de la colonne dans le jeu d'enregistrements retourné est plutôt méchant! Le nom de colonne semble inclure des éléments aléatoires (ou un GUID), et par conséquent je suis réticent à l'utiliser dans mon application (différentes instances ou différents serveurs peuvent avoir un autre GUID). Malheureusement, je ne peux pas utiliser * pour sélectionner la valeur, et en raison des restrictions dans l'application existante je ne peux pas parcourir les colonnes retournées, soit ...

Y at-il un moyen de forcer le nom de colonne dans le jeu d'enregistrements renvoyé à quelque chose de plus sensible?

Répondre

65

Cela devrait faire:

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

Pas joli mais devrait donner le résultat que vous avez besoin

+0

en raison de votre réponse, je l'ai trouvé solution mon problème .. merci beaucoup! –

+0

Syntaxe bizarre mais ça marche !!! –

2

procédure stockée

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

Voulez-vous commenter votre code? Qu'est-ce que cela ajoute à la réponse actuellement acceptée avec 12 upvotes et un code simple? – Yaroslav

+0

En fait, il y a une différence subtile. Vous remarquerez que Vadym renvoie une variable locale de type "Xml". Dans la réponse acceptée, le résultat est (je pense) une chaîne. Je sais que ça ne devrait pas être le cas, mais ce n'est certainement pas du type "Xml". –

+0

Je mis en colère à cause de cette subtilité. – rainabba

10

Try this ...

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

Note: Si vous omettez le "type" après le "pour xml", vous obtenez (je pense) une chaîne.

+2

Yup. TYPE est requis si vous souhaitez conserver le type de données xml pour la colonne résultante. –

0

Pour la génération EXPLICITE xml - avec les syndicats dont vous avez besoin pour envelopper les résultats une fois de plus (En conséquence de bonus en 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

Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire expliquant pourquoi et/ou comment ce code répond à la question améliore sa valeur à long terme. – adiga

+0

Si vous ne voulez pas de nœud xml Veuillez vous référer au code – Mahadev

+0

[Modifier] (https://stackoverflow.com/posts/46972316/edit) pour obtenir la réponse et ajouter des commentaires supplémentaires expliquant pourquoi cela fonctionnerait. – adiga

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