sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server FOR XML Path crea nodos repetidos

Agregue una columna con NULL como valor para generar un nodo de elemento separado para cada columna.

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;

Resultado:

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

Violín SQL

¿Por qué funciona esto?

Las columnas sin nombre se insertan como nodos de texto. En este caso, el valor NULL se inserta como un nodo de texto entre el item nodos.

Si agrega valores reales en lugar de NULL, verá lo que está sucediendo.

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;

Resultado:

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

Otra forma de especificar una columna sin nombre es usar el carácter comodín * como un alias de columna.

Columnas con un nombre especificado como carácter comodín

No es necesario usar el comodín en este caso porque las columnas con valores NULL no tienen un nombre de columna, pero es útil cuando desea valores de columnas reales pero no desea que el nombre de la columna sea un nombre de nodo.