Ich versuche, die SQL-Berichte eines anderen zu debuggen, und habe die zugrunde liegende Berichtsabfrage in ein Abfragefenster von SQL 2012 gestellt.
Einer der Parameter, nach denen der Bericht fragt, ist eine Liste von Ganzzahlen. Dies wird im Bericht über ein Dropdown-Feld mit Mehrfachauswahl erreicht. Die zugrunde liegende Abfrage des Berichts verwendet diese Ganzzahlliste in der where
Klausel, z
select *
from TabA
where TabA.ID in (@listOfIDs)
Ich möchte die Abfrage, die ich debugge, nicht ändern, kann jedoch nicht herausfinden, wie auf dem SQL Server eine Variable erstellt wird, die diese Art von Daten zum Testen enthält.
z.B
declare @listOfIDs int
set listOfIDs = 1,2,3,4
Es gibt keinen Datentyp, der eine Liste von Ganzzahlen enthalten kann. Wie kann ich die Berichtsabfrage auf meinem SQL Server mit denselben Werten wie der Bericht ausführen?
quelle
Antworten:
Tabellenvariable
oder
quelle
SET @AddressIDs = (SELECT ID FROM address WHERE Account = 1234)
Diese Abfrage gibt mehrere IDs zurück und es wird eine Fehlermeldung angezeigt, dass die Unterabfrage mehr als ein Ergebnis zurückgegeben hat und dies nicht zulässig ist. Gibt es überhaupt eine Variable zu erstellen, die ein Array speichert, wenn IDs aus einer Unterabfrage stammen?Angenommen, die Variable ist ähnlich wie:
Und die gespeicherte Prozedur verwendet es in dieser Form:
Sie können die IntList erstellen und die Prozedur folgendermaßen aufrufen:
Oder wenn Sie die IntList selbst bereitstellen
quelle
Sie haben Recht, es gibt keinen Datentyp in SQL-Server, der eine Liste von Ganzzahlen enthalten kann. Sie können jedoch eine Liste von Ganzzahlen als Zeichenfolge speichern.
Sie können die Zeichenfolge dann in separate Ganzzahlwerte aufteilen und in eine Tabelle einfügen. Ihr Verfahren könnte dies bereits tun.
Sie können auch eine dynamische Abfrage verwenden, um das gleiche Ergebnis zu erzielen:
quelle
Für SQL Server 2016+ und Azure SQL Database wurde die Funktion STRING_SPLIT hinzugefügt, die eine perfekte Lösung für dieses Problem darstellt. Hier ist die Dokumentation: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql
Hier ist ein Beispiel:
Das Ergebnis der Abfrage ist 1,3
~ Prost
quelle
Am Ende kam ich zu dem Schluss, dass ich die Werte nicht in Variablen speichern konnte, ohne die Funktionsweise der Abfrage zu ändern. Ich habe den SQL-Profiler verwendet, um die Werte abzufangen, und sie dann fest in die Abfrage codiert, um zu sehen, wie es funktioniert. Es gab 18 dieser ganzzahligen Arrays und einige enthielten über 30 Elemente.
Ich denke, dass MS / SQL einige zusätzliche Datentypen in die Sprache einführen muss. Arrays sind weit verbreitet und ich verstehe nicht, warum Sie sie nicht in einem gespeicherten Prozess verwenden konnten.
quelle
Sie können dies nicht so tun, aber Sie können die gesamte Abfrage ausführen, indem Sie sie in einer Variablen speichern.
Beispielsweise:
quelle
In SQL gibt es eine neue Funktion, die aufgerufen wird,
string_split
wenn Sie eine Liste von Zeichenfolgen verwenden. Ref Link STRING_SPLIT (Transact-SQL)Sie können diese Abfrage
in
wie folgt übergeben:quelle
Ich benutze das :
1-Deklarieren Sie eine temporäre Tabellenvariable im Skript Ihres Gebäudes:
2-Zuordnung zur temporären Tabelle:
3-Verweisen Sie auf die Tabelle, wenn Sie sie in einer WHERE-Anweisung benötigen:
quelle