Clause IN SQL Server et variables VARCHAR : un guide de dépannage
Problème :
Le code SQL Server suivant génère une erreur de conversion :
<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>
Explication de l'erreur :
La clause IN
attend une liste de valeurs séparées par des virgules du même type de données que la colonne comparée (dans ce cas, Id
, qui est vraisemblablement un entier). La variable @ExcludedList
est un VARCHAR(MAX)
, contenant une chaîne. SQL Server tente de convertir implicitement la chaîne entière en entier, ce qui entraîne un échec car la chaîne comprend des virgules.
Solution :
Évitez d'utiliser une variable de chaîne directement dans la clause IN
. Utilisez plutôt une approche table :
<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>
Ce code amélioré utilise STRING_SPLIT
, une fonction intégrée qui divise efficacement la chaîne séparée par des virgules en lignes individuelles. La valeur de chaque ligne est ensuite insérée dans la variable entière du tableau @IntExcludedList
, permettant une comparaison correcte avec la colonne Id
. Cette méthode empêche les conversions implicites et garantit que la clause IN
fonctionne comme prévu. Notez l'utilisation de guillemets simples autour des valeurs de chaîne dans @ExcludedList
.
Cette approche est plus efficace et plus lisible que la solution originale qui utilisait SUBSTRING
et PATINDEX
. Il exploite les capacités intégrées de manipulation de chaînes de SQL Server pour des performances optimales.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!