Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server FOR XML Path faz nós repetidos


Adicione uma coluna com valor NULL para gerar um nó de item separado para cada coluna.
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>

SQL Fiddle

Por que isso funciona?

Colunas sem nome são inseridas como nós de texto. Neste caso o valor NULL é inserido como um nó de texto entre o item nós.

Se você adicionar valores reais em vez de NULL, verá o que está acontecendo.
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>

Outra maneira de especificar uma coluna sem nome é usar o caractere curinga * como um alias de coluna.

Colunas com um nome especificado como um caractere curinga

Não é necessário usar o curinga neste caso porque as colunas com valores NULL não têm um nome de coluna, mas é útil quando você deseja valores de colunas reais, mas não deseja que o nome da coluna seja um nome de nó.