Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server FOR XML Path crea nodi ripetuti

Aggiungi una colonna con NULL come valore per generare un nodo elemento separato per ogni colonna.

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;

Risultato:

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

SQL Violino

Perché funziona?

Le colonne senza nome vengono inserite come nodi di testo. In questo caso il valore NULL viene inserito come nodo di testo tra l'item nodi.

Se aggiungi valori effettivi invece di NULL vedrai cosa sta succedendo.

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;

Risultato:

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

Un altro modo per specificare una colonna senza un nome consiste nell'utilizzare il carattere jolly * come alias di colonna.

Colonne con un nome specificato come carattere jolly

Non è necessario utilizzare il carattere jolly in questo caso perché le colonne con valori NULL non hanno un nome di colonna, ma è utile quando si vogliono valori da colonne effettive ma non si desidera che il nome della colonna sia un nome di nodo.