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é?
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
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.
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
DECLARE @XmlData XML;
SET @XmlData =(SELECT * FROM [dbo].[Users] ORDER by UserName FOR XML path(''))
SELECT @XmlData AS Result
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]
DECLARE @XmlData XML;
SET @XmlData = (
SELECT *
FROM [dbo].[TABLE1]
FOR XML PATH('ChildNodeDetailsResponse')
,ROOT('ParentNode')
)
SELECT @XmlData AS Result