Ich habe eine Transact-SQL-Abfrage, die den IN-Operator verwendet. Etwas wie das:
select * from myTable where myColumn in (1,2,3,4)
Gibt es eine Möglichkeit, eine Variable für die gesamte Liste "(1,2,3,4)" zu definieren? Wie soll ich es definieren?
declare @myList {data type}
set @myList = (1,2,3,4)
select * from myTable where myColumn in @myList
Antworten:
quelle
quelle
[Err] 42000 - [SQL Server]Must declare the scalar variable "@mylist".
(VALUES (1),(2),(3),(4),(5))
direkt verwenden?Es gibt zwei Möglichkeiten, um dynamische CSV-Listen für TSQL-Abfragen anzugehen:
1) Verwenden einer inneren Auswahl
2) Verwenden von dynamisch verkettetem TSQL
3) Eine mögliche dritte Option sind Tabellenvariablen. Wenn Sie über SQl Server 2005 verfügen, können Sie eine Tabellenvariable verwenden. Wenn Sie mit SQL Server 2008 arbeiten, können Sie sogar ganze Tabellenvariablen als Parameter an gespeicherte Prozeduren übergeben und in einem Join oder als Unterauswahl in der IN-Klausel verwenden.
quelle
Verwenden Sie eine Funktion wie diese:
Anstatt like zu verwenden, erstellen Sie einen inneren Join mit der von der Funktion zurückgegebenen Tabelle:
wird
In einer nicht indizierten 1M-Datensatztabelle dauerte die zweite Version ungefähr die Hälfte der Zeit ...
Prost
quelle
Bitte beachten Sie, dass es für lange Listen oder Produktionssysteme nicht empfohlen wird, diese Methode zu verwenden, da sie möglicherweise viel langsamer ist als einfache
IN
BedienersomeColumnName in (1,2,3,4)
(getestet mit einer Liste mit mehr als 8000 Artikeln).quelle
Nein, es gibt keinen solchen Typ. Es gibt jedoch einige Möglichkeiten:
Keines davon ist wirklich elegant, aber das ist das Beste, was es gibt.
quelle
leichte Verbesserung gegenüber @LukeH, es besteht keine Notwendigkeit, das "INSERT INTO" zu wiederholen: und die Antwort von @ realPT - es ist nicht erforderlich, das SELECT zu haben:
quelle
Ich weiß, dass dies jetzt alt ist, aber TSQL => 2016 können Sie STRING_SPLIT verwenden:
quelle
Ab SQL2017 können Sie STRING_SPLIT verwenden und dies tun:
quelle
Wenn Sie dies ohne Verwendung einer zweiten Tabelle tun möchten, können Sie einen LIKE-Vergleich mit einem CAST durchführen:
Wenn das Feld, das Sie vergleichen, bereits eine Zeichenfolge ist, müssen Sie CAST nicht ausführen.
Wenn Sie sowohl die Spaltenübereinstimmung als auch jeden eindeutigen Wert in Kommas umgeben, wird eine genaue Übereinstimmung sichergestellt. Andernfalls würde ein Wert von 1 in einer Liste mit ', 4,2,15,' gefunden.
quelle
Wie bereits erwähnt, können Sie ab SQL Server 2016 auch JSON-Arrays verwenden und
OPENJSON (Transact-SQL)
:Sie können es in testen sql fiddle demo
Sie können auch kompliziertere Fälle mit json einfacher abdecken - siehe Liste der Werte und Bereiche in SQL mit der WHERE IN-Klausel mit SQL-Variable durchsuchen?
quelle
Dieser verwendet PATINDEX, um IDs aus einer Tabelle mit einer nicht durch Ziffern getrennten Ganzzahlliste abzugleichen.
Anmerkungen:
quelle
quelle
Ich denke, Sie müssen eine Zeichenfolge deklarieren und diese SQL-Zeichenfolge dann ausführen.
Schauen Sie sich sp_executeSQL an
quelle