Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server FOR XML Path crée des nœuds répétitifs

Ajoutez une colonne avec NULL comme valeur pour générer un nœud d'élément distinct pour chaque colonne.

SELECT 
  t.col1 as 'item'
 ,NULL
 ,t.col2 as 'item'
 ,NULL
 ,t.col3 as 'item' 
FROM dbo.tbl as t 
FOR XML PATH('parent'), TYPE;

Résultat :

<parent>
  <item>1</item>
  <item>2</item>
  <item>3</item>
</parent>

Violon SQL

Pourquoi cela fonctionne-t-il ?

Les colonnes sans nom sont insérées en tant que nœuds de texte. Dans ce cas, la valeur NULL est insérée en tant que nœud de texte entre le item nœuds.

Si vous ajoutez des valeurs réelles au lieu de NULL, vous verrez ce qui se passe.

SELECT 
  t.col1 as 'item'
 ,'1'
 ,t.col2 as 'item'
 ,'2'
 ,t.col3 as 'item' 
FROM dbo.tbl as t 
FOR XML PATH('parent'), TYPE;

Résultat :

<parent>
  <item>1</item>1<item>2</item>2<item>3</item></parent>

Une autre façon de spécifier une colonne sans nom consiste à utiliser le caractère générique * comme alias de colonne.

Colonnes avec un nom spécifié en tant que caractère générique

Il n'est pas nécessaire d'utiliser le caractère générique dans ce cas car les colonnes avec des valeurs NULL n'ont pas de nom de colonne, mais il est utile lorsque vous voulez des valeurs de colonnes réelles mais que vous ne voulez pas que le nom de la colonne soit un nom de nœud.