Wir verwenden eine kleine SQL-Funktion, die die Zeichenfolge durch ein Trennzeichen teilt und diese Werte in einer Tabelle zurückgibt.ORDER BY (SELECT NULL)
ALTER FUNCTION [shark].[SplitStrings]
(
@List VARCHAR(MAX),
@Delimiter VARCHAR(255)
)
RETURNS TABLE
AS
RETURN (SELECT [Item], ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS [Id] FROM
(SELECT Item = x.i.value('(./text())[1]', 'varchar(max)')
FROM (SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')
) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y
WHERE Item IS NOT NULL
);
Die Frage ist, ob dies die Reihenfolge der Elemente aus der Zeichenfolge ändern kann?
Ex.
SELECT * FROM [shark].[SplitStrings] ('1,2,3,4,5', ',')
Kann diese Rückkehr
1
5
3
4
2
statt
1
2
3
4
5
?
WEITERE INFORMATIONEN: Nach Monaten des normalen Arbeitens, fanden wir einen Fehler in einer unserer Komponenten und die einzige Quelle, die wir finden konnten und die diesen Fehler verursachen könnte, ist das erwähnte Verfahren. Es änderte irgendwie die Reihenfolge des String-Arrays, das 65 000 Elemente enthielt (die Gesamtlänge des Strings mit Trennzeichen betrug 65 000 * 11). Wir haben versucht, denselben Fehler auf demselben SQL-Server zu reproduzieren, aber ohne Glück. Ihre Kommentare und Antworten haben diesen Sproc schuldiger gemacht.
Alles, was die 'ORDER BY' Klausel ist, ist es zu definieren, was 'ROW_NUMBER()' Werte den Zeilen zugewiesen sind. Da jedoch allen Zeilen innerhalb dieser Klausel derselbe Wert zugewiesen wird, sind die zugewiesenen Zeilennummern in keiner Weise garantiert. Und nichts davon garantiert, dass * die Reihenfolge beeinflusst wird, in der Ergebnisse zurückgegeben werden *. –
Ich stimme @Damien_The_Unbeliever zu. Das Fehlen einer logischen Reihenfolge könnte zu einer beliebigen Reihenfolge führen.Ich hatte eine Abfrage, die jahrelang Daten in der von mir gewünschten Reihenfolge zurückgegeben hatte, und nach einem SQL Server-Upgrade begann sie, sie in einer anderen Reihenfolge bereitzustellen, weil es keine explizite Reihenfolge gab. Wir haben unsere Funktionen so ähnlich gemacht, dass eine genaue Zeilennummerierung möglich ist. nicht effizient, aber korrekt. – UnhandledExcepSean
XQuery * verarbeitet Elemente in der richtigen Reihenfolge. Wenn Sie dies also robuster machen möchten, implementieren Sie einen Zähler darin (XQuery verfügt ebenfalls über native Funktionen zur Knotenzählung, aber SQL Server implementiert diese nicht). Die XML-Knoten haben eine Reihenfolge. Die 'ROW_NUMBER()' nicht. In der Praxis weiß ich nicht, ob Sie jemals beobachten könnten, dass der Optimierer hier außer Kontrolle gerät - wenn es möglich ist, dann wahrscheinlich für einen großen Satz, wenn ein paralleler Plan gewählt wird, aber Ihre Strings wahrscheinlich zu klein sind, um jemals ausgelöst zu werden Das. –