Éviter le SQL dynamique : gestion des valeurs séparées par des virgules dans la clause IN de SQL Server
Le passage direct d'une chaîne délimitée par des virgules à la fonction IN
de SQL Server entraîne souvent des erreurs de conversion de type. Examinons un scénario courant :
<code class="language-sql">DECLARE @Ids varchar(50); SET @Ids = '1,2,3,5,4,6,7,98,234'; SELECT * FROM sometable WHERE tableid IN (@Ids);</code>
Cela entraînera une erreur de conversion car la clause IN
attend des valeurs entières individuelles, pas une chaîne. Pour contourner cela sans utiliser de SQL dynamique, une méthode plus robuste consiste à utiliser la fonction CHARINDEX
:
<code class="language-sql">DECLARE @Ids varchar(50); SET @Ids = ',1,2,3,5,4,6,7,98,234,'; --Note the added commas SELECT * FROM sometable WHERE CHARINDEX(',' + CAST(tableid AS VARCHAR(8000)) + ',', @Ids) > 0;</code>
Cette requête améliorée ajoute intelligemment des virgules aux deux extrémités de la chaîne @Ids
. CHARINDEX
recherche ensuite une version délimitée par des virgules de tableid
dans la chaîne @Ids
modifiée. Cela garantit des correspondances exactes et évite les correspondances partielles qui pourraient conduire à des résultats incorrects. Seules les lignes où le tableid
se trouve dans la liste séparée par des virgules seront renvoyées.
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!