Maison >base de données >tutoriel mysql >Pourquoi l'utilisation d'une variable VARCHAR dans une clause SQL Server IN provoque-t-elle une erreur de conversion ?

Pourquoi l'utilisation d'une variable VARCHAR dans une clause SQL Server IN provoque-t-elle une erreur de conversion ?

DDD
DDDoriginal
2025-01-09 20:42:46337parcourir

Why Does Using a VARCHAR Variable in an SQL Server IN Clause Cause a Conversion Error?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn