2016-05-17 15 views
0

ich versuche, hier zu verstehen, was (eine der Antworten auf diese Frage: Concatenate many rows into a single text string?): geschiehtZuweisen mehrerer Zeilen nicht-Tabellenvariable

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + Name 
FROM People 

So habe ich eine beispielhafte Tabelle ‚Test‘ mit Daten: Jetzt

Col1 
---- 
abc 
xyz 

ich ausführen:

DECLARE @Concatenation VARCHAR(8000) 
SELECT @Concatenation = COALESCE(@Concatenation + ', ', '') + Col1 FROM test 
Select @Concatenation 

Und als Ergebnis habe ich ein einziges Ergebnis abc, xyz

Wenn ich ausführen:

DECLARE @Concatenation VARCHAR(8000) 
SELECT @Concatenation = Col1 FROM test 
Select @Concatenation 

ich ein einzelnes Ergebnis erhalten xyz

Die Frage, warum tut eine Zuordnung wie select @variable = @variable + column die @variable verursacht über die gesamte Spalte zu wiederholen? Und wenn ich es wie select @variable = column mache, welche Aufzeichnung von der Spalte zurückgegeben wird? Zufällig?

+0

das ist undokumentiert Hack ein Ja, es funktioniert, aber Sie sollten XML Trick verwenden, um dies zu tun. –

+1

Für Ihre letzte Frage: Die Zuweisung wird den ** letzten ** Datensatz verwenden. Ich denke, es durchläuft sowieso alle Datensätze, und mit der "Koaleszenz" -Methode werden tatsächlich alle Datensätze gespeichert. – HoneyBadger

+0

@HoneyBadger Wie definierst du den letzten Datensatz? Es gibt keinen Cluster oder irgendeinen Index. – zaptask

Antwort

0

Dies ist, was Sie sollten stattdessen tun:

SELECT STUFF((SELECT ',' + name 
       FROM People 
       FOR 
       XML PATH('') 
      ), 1, 1, '') 

Das erste Beispiel in der Frage ein Hack ist und funktioniert nur durch Zufall. Sehen Sie diese Themen:

https://connect.microsoft.com/SQLServer/Feedback/Details/383641

nvarchar concatenation/index/nvarchar(max) inexplicable behavior

Die zweite zurückkehren können Sie jeden Wert, weil Sie nicht um die Angabe sind.

+0

Was meinen Sie damit, dass es zufällig funktioniert? Gibt es eine ausführlichere Beschreibung des Problems? Ist es SQL Server spezifisch? T-SQL-spezifisch? Funktioniert es in anderen Dialekten? – zaptask

+0

Korrigieren Sie mich, wenn ich falsch liege, aber nach dem, was ich gelesen habe, ist dies ein "Hack, der zufällig funktioniert". Es gibt keine Funktion in 'sql server' wie' group_concat' von 'mysql'. – HoneyBadger

+0

@zaptask, ich meine, das ist undokumentierte Funktion und kann nur aus zukünftigen Versionen von SQL Server entfernt werden. Und es gibt einige Schwierigkeiten damit. Ich erinnere mich, dass ich darüber gelesen habe. Ich werde danach suchen. –

Verwandte Themen