12 Stimmen

SQL benutzerdefinierte Aggregatreihenfolge der Werte erhalten?

Ich verwende den Code aus diese MSDN-Seite um ein benutzerdefiniertes Aggregat zur Verkettung von Zeichenketten zu erstellen mit group by's im SQL-Server. Eine meiner Anforderungen ist, dass die Reihenfolge der verketteten Werte die gleiche ist wie in der Abfrage. Zum Beispiel:

Value   Group
1       1
2       1
3       2
4       2

Abfrage verwenden

SELECT
  dbo.Concat(tbl.Value) As Concat,
  tbl.Group
FROM
  (SELECT TOP 1000
     tblTest.*
  FROM 
    tblTest
  ORDER BY 
    tblTest.Value) As tbl
GROUP BY
  tbl.Group

Würde dazu führen:

Concat  Group
"1,2"   1
"3,4"   2

Das Ergebnis scheint immer korrekt und wie erwartet zu sein, aber dann stieß ich auf diese Seite die besagt, dass die Bestellung nicht garantiert ist und dass das Attribut SqlUserDefinedAggregateAttribute.IsInvariantToOrder ist nur für die zukünftige Verwendung reserviert.

Meine Frage ist also: Ist es richtig anzunehmen, dass die verketteten Werte in der Zeichenfolge in beliebiger Reihenfolge enden können?
Wenn das der Fall ist, warum verwendet der Beispielcode auf der MSDN-Seite die IsInvariantToOrder Attribut?

5voto

Marc Gravell Punkte 970173

Ich vermute, ein großes Problem ist hier Ihre Aussage "die gleiche wie in der Abfrage" - aber Ihre Abfrage niemals definiert (und kann nicht definieren) eine Reihenfolge nach den Dingen, die aggregiert werden (Sie können natürlich die Gruppen indem sie eine ORDER BY nach dem GROUP BY ). Darüber hinaus kann ich nur sagen, dass es sich um eine reine einstellen. (und nicht eine geordnete Folge), und dass technisch die Reihenfolge ist in der Tat unbestimmt.

0voto

Mike Monteiro Punkte 1418

Die akzeptierte Antwort ist zwar richtig, aber ich möchte eine Umgehungslösung vorstellen, die für andere nützlich sein könnte. Warnung: Es geht darum, überhaupt kein benutzerdefiniertes Aggregat zu verwenden :)

Der unten stehende Link beschreibt eine elegante Methode zur Erstellung einer verketteten, abgegrenzten Liste, die nur eine SELECT-Anweisung und eine varchar-Variable verwendet. Der Vorteil (für diesen Thread) besteht darin, dass Sie die Reihenfolge angeben können, in der die Zeilen verarbeitet werden. Der Nachteil ist, dass Sie nicht einfach über viele verschiedene Teilmengen von Zeilen hinweg verketten können, ohne dass es zu mühsamen Iterationen kommt.

Nicht perfekt, aber für meinen Anwendungsfall war das eine gute Lösung.

http://blog.sqlauthority.com/2008/06/04/sql-server-create-a-comma-delimited-list-using-select-clause-from-table-column/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X