SQL Server IN-Klausel und VARCHAR-Variablen: Ein Leitfaden zur Fehlerbehebung
Problem:
Der folgende SQL Server-Code generiert einen Konvertierungsfehler:
<code class="language-sql">DECLARE @ExcludedList VARCHAR(MAX) SET @ExcludedList = '3, 4, 22' -- Note: Strings are now enclosed in single quotes SELECT * FROM A WHERE Id NOT IN (@ExcludedList)</code>
Erklärung des Fehlers:
Die IN
-Klausel erwartet eine durch Kommas getrennte Liste von Werten desselben Datentyps wie die zu vergleichende Spalte (in diesem Fall Id
, was vermutlich eine ganze Zahl ist). Die Variable @ExcludedList
ist ein VARCHAR(MAX)
, das eine Zeichenfolge enthält. SQL Server versucht, die gesamte Zeichenfolge implizit in eine Ganzzahl zu konvertieren, was zu einem Fehler führt, da die Zeichenfolge Kommas enthält.
Lösung:
Vermeiden Sie die Verwendung einer Zeichenfolgenvariablen direkt innerhalb der IN
-Klausel. Verwenden Sie stattdessen einen Tabellenwertansatz:
<code class="language-sql">DECLARE @ExcludedList VARCHAR(MAX) SET @ExcludedList = '3, 4, 22' DECLARE @IntExcludedList TABLE (ID INT); INSERT INTO @IntExcludedList (ID) SELECT value FROM STRING_SPLIT(@ExcludedList, ','); SELECT * FROM A WHERE Id NOT IN (SELECT ID FROM @IntExcludedList);</code>
Dieser verbesserte Code nutzt STRING_SPLIT
, eine integrierte Funktion, die die durch Kommas getrennte Zeichenfolge effizient in einzelne Zeilen aufteilt. Der Wert jeder Zeile wird dann in die ganzzahlige Tabellenvariable @IntExcludedList
eingefügt, um einen korrekten Vergleich mit der Spalte Id
zu ermöglichen. Diese Methode verhindert implizite Konvertierungen und stellt sicher, dass die IN
-Klausel wie vorgesehen funktioniert. Beachten Sie die Verwendung von einfachen Anführungszeichen um die Zeichenfolgenwerte in @ExcludedList
.
Dieser Ansatz ist effizienter und lesbarer als die ursprüngliche Lösung, die SUBSTRING
und PATINDEX
verwendet. Es nutzt die integrierten String-Manipulationsfunktionen von SQL Server für optimale Leistung.
Das obige ist der detaillierte Inhalt vonWarum verursacht die Verwendung einer VARCHAR-Variablen in einer SQL Server-IN-Klausel einen Konvertierungsfehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!