2015-05-16 12 views
7

Si prega di vedere il DDL di seguito:Perché STUFF rimuove XML?

create table #Test (id int,Name varchar(30)) 

insert into #Test values (1,'Ian') 
insert into #Test values(1,'Mark') 
insert into #Test values(2,'James') 
insert into #Test values(3,'Karen') 
insert into #Test values(3,'Suzie') 

e SQL di seguito:

select * from #Test for xml path('') 

che restituisce:

<id>1</id> 
<Name>Ian</Name> 
<id>1</id> 
<Name>Mark</Name> 
<id>2</id> 
<Name>James</Name> 
<id>3</id> 
<Name>Karen</Name> 
<id>3</id> 
<Name>Suzie</Name> 

Questo è quello che mi aspetterei. Ora, vedere lo SQL qui sotto:

SELECT distinct ID, 
STUFF((select ','+ NAME from #Test as #Test1 where #Test1.id=#Test2.id FOR XML PATH('')),1,1,'') FROM #Test as #Test2 

che restituisce:

1 Ian,Mark 
2 James 
3 Karen,Suzie 

Questo è quello che voglio restituito. Tuttavia, dove sono finiti gli elementi XML?

risposta

1

Non è il STUFF, questo è solo per rimuovere il superfluo prima ,.

Il concat rimuove la roba XML:

','+ NAME 
or 
NAME + '' 

Non chiedetemi perché funziona in questo modo, forse è documentato da qualche parte :-)

1

interna per dichiarazione XML è solo per la produzione di risultato concatenando . Aggiungi esterna per la dichiarazione xml:

SELECT distinct ID, 
    STUFF((select ','+ NAME 
      from Test as #Test1 
      where #Test1.id=#Test2.id 
      FOR XML PATH('')),1,1,'') as Names 
FROM Test as #Test2 
FOR XML PATH('') 

uscita:

<ID>1</ID><Names>Ian,Mark</Names><ID>2</ID><Names>James</Names><ID>3</ID><Names>Karen,Suzie</Names> 

Fiddle http://sqlfiddle.com/#!6/5f254/13

1

Bisogna confrontare le mele alle mele. Mentre è vero che

select * from #Test for xml path('') 

produce qualcosa che assomiglia a XML (ma tecnicamente non è perché non ha un elemento radice), questo (quello che si sta effettivamente eseguendo)

select ',' + name from #Test for xml path('') 

non lo fa. Sulla mia macchina, produce la stringa ff: ", Ian, Mark, James, Karen, Suzie". Da lì, la roba funziona whacks la prima virgola e si ottiene un elenco di valori separati da virgola.

1

Perché STUFF rimuove XML?

STUFF rimuove la prima virgola nella stringa, non è responsabile della rimozione dei nomi degli elementi XML.

FOR XML PATH utilizza i nomi delle colonne per creare i nomi degli elementi XML. Quando si concatenano due valori insieme, ','+ NAME, la colonna risultante non ha un nome, quindi FOR XML PATH non può generare un nome di elemento per l'utente.

Il comportamento è documentato in Columns without a Name.

Qualsiasi colonna senza nome sarà in linea. Ad esempio, le colonne calcolate o le query scalari nidificate che non specificano l'alias di colonna genereranno colonne senza alcun nome.

+0

Questa è una delle cose più importanti che ho letto su questo. Ciò dimostra che il codice è in realtà un hack e probabilmente non può essere invocato nelle versioni future. Questa è la risposta corretta. – Paul

Problemi correlati