Ich habe 2 Zeichenketten in der Eingabe, zum Beispiel '1,5,6' und '2,89,9' mit der gleichen Anzahl von Elementen (3 oder plus). Diese 2 Zeichen, die ich möchte, haben einen "Ordinate Join" als
gemacht %Vor%ich habe mir gedacht, eine rownumber zuzuweisen und eine Verknüpfung zwischen 2 Resultsets als
gemacht %Vor%ist das eine Best Practice ?
Wenn dbo.Split()
den Datensatz zurückgibt, können Sie die gewünschte Zeilennummer (basierend auf ihrer Reihenfolge in der Zeichenfolge) nicht absolut sicher zuweisen. SQL never garantiert eine Reihenfolge ohne ORDER BY
, die sich tatsächlich auf die Daten bezieht.
Wenn Sie Trick von (SELECT 0)
verwenden, um nach Ihnen zu sortieren, können Sie oft die richtigen Werte erhalten. Wahrscheinlich sehr oft. Aber das ist nie garantiert . Gelegentlich werden Sie eine falsche Reihenfolge erhalten.
Am besten ist es, wenn Sie dbo.Split()
so umschreiben, dass Sie eine Zeilennummer zuweisen, während die Zeichenfolge analysiert wird. Nur dann können Sie mit 100% Sicherheit wissen, dass die Zeilennummer wirklich der Position des Elements in der Liste entspricht.
Dann schließen Sie sich ihnen an, wie Sie vorschlagen, und erhalten Sie die gewünschten Ergebnisse.
Ansonsten scheint mir die Idee gut zu sein. Obwohl Sie vielleicht eine FULL OUTER JOIN
berücksichtigen möchten, wenn eine Liste länger als die andere sein kann.
Du kannst es auch so machen
Betrachten Sie Ihre Split-Funktion wie folgt:
%Vor% Es wird eine einfache Aufgabe sein JOIN
zusammen zu machen. So:
Der Vorteil ist, dass Sie kein ROW_NUMBER() OVER(ORDER BY SELECT 0)
Bearbeiten
Wie im Kommentar ist die Performance mit einer rekursiven Split-Funktion besser. Also vielleicht so etwas:
%Vor%Und dann ist die Auswahl wie folgt:
%Vor%Danke an Arions Vorschlag. Es ist sehr nützlich für mich. Ich habe die Funktion ein wenig geändert, um den varchar (max) -Typ der Eingabezeichenfolge und die maximale Länge von 1000 für die Trennzeichenfolge zu unterstützen. Außerdem wurde ein Parameter hinzugefügt, der angibt, ob Sie die leere Zeichenfolge in der endgültigen Rückgabe benötigen.
Für die Frage von MatBailie, weil dies eine Inline-Funktion ist, können Sie die pn-Spalte in Ihre äußere Abfrage einfügen, die diese Funktion aufruft.
%Vor%Aber ich stieß auf ein kleines Problem mit dieser Funktion, wenn die Liste, die zurückgeben soll, mehr als 100 Datensätze hatte. Also habe ich eine andere Funktion rein mit String-Parsing-Funktionen erstellt:
%Vor%Ich hoffe, das könnte helfen.
Tags und Links sql sql-server sql-server-2008 join