2016-09-22 1 views
0

Je dois retourner un alias de colonne contenant des espaces en XML à partir de SQL Server. XML devrait ressembler à ceci:SQL Server: spécifiez le nom de la colonne en tant qu'attribut et valeur de nœud FOR XML

<Records> 
    <Record> 
     <Field FieldName="PURCHASE_DETAIL_ID">31320</Field> 
     <Field FieldName="ORDER_ID">6507</Field> 
     <Field FieldName="PRODUCT_ORDER">1</Field> 
    </Record> 
</Records> 

Ma table ressemble:

PURCHASE_DETAIL_ID | ORDER_ID | PRODUCT_ORDER 
---------------------------------------------------- 
    31320    6507    1 

Je voudrais utiliser la méthode d'extraction FOR XML XML.

J'ai essayé ce qui suit, cela fonctionne bien pour une seule colonne, mais pas pour plusieurs.

SELECT 
    'PURCHASE_DETAIL_ID' AS [Field/@FieldName], 
    'GOLI' + RTRIM(CONVERT(VARCHAR(10), ol.ID)) AS [Field], 
    'ORDER_ID' AS [Field/@FieldName], 
    o.ID AS [Field], 
    'PRODUCT_ID' AS [Field/@FieldName], 
    P.ID AS [Field] 
FROM ... 
WHERE ... 
FOR XML PATH('Record'), ROOT('Records') 

Répondre

1

C'est ce que vous avez à faire ...

SELECT 
    'PURCHASE_DETAIL_ID' AS [Field/@FieldName], 
    'GOLI' + RTRIM(CONVERT(VARCHAR(10), ol.ID)) AS [Field], 
'', 
    'ORDER_ID' AS [Field/@FieldName], 
    o.ID AS [Field], 
'', 
    'PRODUCT_ID' AS [Field/@FieldName], 
    P.ID AS [Field] 
FROM ... 
WHERE ... 
FOR XML PATH('Record'), ROOT('Records') 
+0

'' est la nouvelle chose que vous avez ici ... –

1

Vous pouvez essayer d'utiliser la valeur des noeuds XML comme ci-dessous:

declare @xml xml = 
'<Records> 
    <Record> 
     <Field FieldName="PURCHASE_DETAIL_ID">31320</Field> 
     <Field FieldName="ORDER_ID">6507</Field> 
     <Field FieldName="PRODUCT_ORDER">1</Field> 
    </Record> 
</Records>' 

;with cte as (
SELECT T.c.value('@FieldName', 'nvarchar(max)') AS result, T.c.value('.','int') as val 
FROM @xml.nodes('/Records/Record/Field') T(c) 
) 
select * from cte 
pivot (max(val) for result in ([PURCHASE_DETAIL_ID],[ORDER_ID],[PRODUCT_ORDER])) p 

sortie sera comme ceci:

enter image description here

Si vous souhaitez obtenir les résultats en ligne sage vous peut exécuter la requête à l'intérieur du cte seul

SELECT T.c.value('@FieldName', 'nvarchar(max)') AS result, T.c.value('.','int') as val 
FROM @xml.nodes('/Records/Record/Field') T(c) 

cela fonctionne

+0

que je veux faire l'inverse –

+0

inverse signifie que vous pouvez exécuter la requête dans la cte SELECT fonctionnera Tcvalue (» @FieldName ',' nvarchar (max) ') Résultat AS, valeur Tc ('. ',' Int ') val FROM @ xml.nodes ('/Enregistrements/Enregistrement/Champ ') T (c) –

+0

Réponse mise à jour basé sur votre commentaire –