web-dev-qa-db-fra.com

Comment choisir le nom de colonne retourné dans une requête SELECT FOR XML?

MS SQL propose une solution de contournement pratique pour concaténer une valeur de colonne de plusieurs lignes en une seule valeur:

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

et cela renvoie un joli jeu d'enregistrements:

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

seul le nom de colonne dans le jeu d'enregistrements retourné est plutôt méchant!

Le nom de la colonne semble inclure des éléments aléatoires (ou un GUID), et donc 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 de l'application existante, je ne peux pas non plus parcourir les colonnes retournées ...

Existe-t-il un moyen de forcer le nom de colonne dans le jeu d'enregistrements retourné à quelque chose de plus sensé?

47
Eero

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 dont vous avez besoin

72
kristof

Essaye ça...

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

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

12
Black Light

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
Vadym Sichkar
DECLARE @XmlData XML;
SET @XmlData =(SELECT * FROM [dbo].[Users] ORDER by UserName FOR XML path(''))
SELECT @XmlData AS Result
1
Mahadev

Pour la génération xml EXPLICIT - avec les unions, vous devez encapsuler les résultats une fois de plus (en tant que résultat 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
JJ Roman
DECLARE @XmlData XML;

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

SELECT @XmlData AS Result
0
Mahadev