Quando eu executo o seguinte
select t.type
from (values ('Green'),('Blue'),('Red')) as t(type)
for xml path('')
Eu recebo esta saída
<type>Green</type>
<type>Blue</type>
<type>Red</type>
Se eu executar o seguinte
select t.type + '/'
from (values ('Green'),('Blue'),('Red')) as t(type)
for xml path('')
Eu recebo esta saída
Green/Blue/Red/
Por que adicionar a concatenação no select leva à remoção das tags de tipo e saída em uma linha no arquivo xml? Executando o SQL Server 2012.
XML é doido
Ao adicionar a string concatenada, você perde o "elemento de caminho".
Por exemplo, se você fizer isso:
Você recebe isso de volta:
O nome ou alias da coluna atua como o elemento do caminho.
Alguns outros exemplos que podem ajudar
Usando
RAW, ELEMENTS
No primeiro exemplo, você obtém o nome genérico do elemento "row", mas no segundo você obtém row/type.
Ao usar
RAW, TYPE
:A primeira consulta retorna um XML válido, a segunda gera um erro porque o elemento de caminho não possui um identificador.
Usando
AUTO
, o alias da tabela e o nome da coluna se transformam no caminho:Mas sem um alias, você recebe um erro semelhante:
Eu daria um exemplo
FOR XML EXPLICIT
, mas seria irresponsável eu começar a beber agora.