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
Libérer: 2025-01-09 20:42:46
original
305 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal