per l'output del percorso xml ('')


9

Quando eseguo quanto segue

select t.type
  from (values ('Green'),('Blue'),('Red')) as t(type)
   for xml path('')

Ricevo questo output

<type>Green</type>
<type>Blue</type>
<type>Red</type>

Se eseguo quanto segue

select t.type + '/'
  from (values ('Green'),('Blue'),('Red')) as t(type)
   for xml path('')

Ricevo questo output

Green/Blue/Red/

Perché l'aggiunta della concatenazione nella selezione porta alla rimozione dei tag di tipo e all'output su una riga nel file xml? Esecuzione di SQL Server 2012.

Risposte:


15

XML è un disastro

Quando aggiungi la stringa concatenata, perdi l '"elemento path".

Ad esempio se lo fai:

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML PATH('');

SELECT t.type + '/' 
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML PATH('type');

Ottieni questo indietro:

<type>Green/</type>
<type>Blue/</type>
<type>Red/</type>

Il nome o l'alias della colonna funge da elemento del percorso.

Alcuni altri esempi che potrebbero aiutare

utilizzando RAW, ELEMENTS

SELECT t.type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, ELEMENTS;

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, ELEMENTS;

Nel primo esempio, ottieni il nome dell'elemento "riga" generico, ma nel secondo ottieni la riga / tipo.

Quando si utilizza RAW, TYPE:

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, TYPE;

SELECT t.type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, TYPE;

La prima query restituisce XML valido-ish, la seconda genera un errore perché l'elemento path non ha un identificatore.

Utilizzando AUTO, l'alias della tabella e il nome della colonna si trasformano nel percorso:

SELECT type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

SELECT type 
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

Ma senza un alias, si ottiene un errore simile:

SELECT type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

Ne farei un esempio, FOR XML EXPLICITma per me sarebbe irresponsabile iniziare a bere proprio ora.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.