2014-02-07 5 views
54

Ich lerne SQL in einem der questionand here Ich sah die Verwendung von diesem, kann einige Körper mich verstehen, was Xml-Pfad ('') in SQL bedeuten? und ja, ich habe Webseiten durchsucht, die ich nicht ganz verstanden habe!Was bedeutet SELECT ... FOR XML PATH (''), 1,1)?

ich nicht immer die Sachen zurück, jetzt, was macht dieses Stück Code zu tun? (Nur select Teil)

declare @t table 
(
    Id int, 
    Name varchar(10) 
) 
insert into @t 
select 1,'a' union all 
select 1,'b' union all 
select 2,'c' union all 
select 2,'d' 

select ID, 
stuff(
(
    select ','+ [Name] from @t where Id = t.Id for XML path('') 
),1,1,'') 
from (select distinct ID from @t)t 
+2

das 1,1) in Frage Header 'stuff' Parameter! stuff nimmt 4 Parameter stuff (@ expr, start, len, ersatz) so sub Abfrage ist der Ausdruck, beginnend bei positin 1, Länge 1, dann ersetzen mit '''' –

+0

Ja. Es war verwirrend. An vielen Orten sah ich, dass die leere SQL-Zeichenfolge ('') so aussieht, als wäre es ein einzelnes Doppelzitat ("), also sieht es so aus, als ob Sie"), 1, 1, "an" path(). –

Antwort

60

Es gibt keine wirkliche Technik hier zu lernen. Es ist nur ein netter Trick, mehrere Datenzeilen zu einer einzigen Zeichenfolge zu verketten. Es ist eher eine skurrile Verwendung eines Features als eine beabsichtigte Verwendung der XML Formatierungsfunktion.

SELECT ',' + ColumnName ... FOR XML PATH('') 

erzeugt einen Satz von durch Kommas getrennte Werte, basierend auf mehrere Reihen von Daten aus der Spalte ColumnName kombiniert. Es wird einen Wert wie ,abc,def,ghi,jkl erzeugen.

STUFF(...,1,1,'') 

wird dann verwendet, um das führende Komma zu entfernen, die der vorherige Trick erzeugt, STUFF Einzelheiten über seine Parameter sehen.

(Seltsamerweise neigen dazu, eine Menge Leute zum Erzeugen eines Komma getrennt Satz von Werten als „STUFF-Methode“ auf dieses Verfahren zu verweisen trotz der STUFF nur für eine endgültige Bit-Trimmen verantwortlich)

+1

ok..und was '' XML PATH ('') ), 3, 1000) 'bedeuten? –

+1

@george - es ist schwierig zu sagen, ohne die größere Abfrage zu sehen.Wie ich gehofft hatte, war offensichtlich von was Ich habe in meiner Antwort gesagt, dass 'FOR XML PATH ('')' und alles, was darüber hinaus auftritt, Teil von zwei * verschiedenen * Tricks oder Verwendungen sind, und Sie müssen früher in der Abfrage suchen, um herauszufinden, welche Funktion es ist Übergeben Sie die ', 3, 1000 'Parameter. –

+0

können Sie sehen @ Update! –

23

SQL Sie Referenzieren wurde für die Kettenverkettung in MSSQL verwendet.

Es verkettet Zeilen durch Voranstellen , mit for xml path zu Ergebnis ,a,b,c,d. Dann mit stuff ersetzt es zuerst , für und entfernt es so.

Die ('') in for xml path wird verwendet, um Wrapper-Knoten zu entfernen, der automatisch erstellt wird. Sonst würde es wie aussehen.

... 
stuff(
    (
    select ',' + CAST(t2.Value as varchar(10)) from #t t2 where t1.id = t2.id 
    for xml path('') 
) 
,1,1,'') as Value 
... 
+0

können Sie sehen @ Update! –

+1

Hier ist eine schöne Beispielanwendung dieser Technik: [Dynamic Pivoting] (http: // pratchev.blogspot .com/2008/12/dynamic-pivoting.html) – David

+1

@David erwähnten Link ist nicht exis t nicht mehr! – QMaster