Maison >base de données >tutoriel mysql >Comment les variables de table peuvent-elles résoudre l'erreur de clause « IN » de SQL Server avec les variables déclarées ?

Comment les variables de table peuvent-elles résoudre l'erreur de clause « IN » de SQL Server avec les variables déclarées ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-09 20:37:42201parcourir

How Can Table Variables Solve SQL Server's

SQL Server : Utilisation de variables de table pour corriger les erreurs de clause "IN" avec les variables déclarées

La clause SQL Server IN est un puissant outil de filtrage. Cependant, l'utilisation d'une variable déclarée directement à l'intérieur de celle-ci entraîne souvent l'erreur : "La conversion a échoué lors de la conversion de la valeur varchar ',' en type de données int." Cela se produit parce que la variable contient fréquemment une chaîne séparée par des virgules, ce qui entraîne des incompatibilités de types de données.

Scénario de problème :

Considérez cet extrait de code :

<code class="language-sql">DECLARE @ExcludedList VARCHAR(MAX)

SET @ExcludedList = '3,4,22'

SELECT * FROM A WHERE Id NOT IN (@ExcludedList)</code>

Erreur résultante :

<code>Error: Conversion failed when converting the varchar value ',' to data type int.</code>

La solution : les variables de table

Pour éviter cette erreur, utilisez une variable de table pour stocker les valeurs. Les variables de tableau offrent plusieurs avantages :

  • Ils stockent des données structurées.
  • Ils peuvent être remplis dynamiquement.
  • Ils fonctionnent comme des tables normales dans les requêtes.

Remplir dynamiquement une variable de table :

Le code suivant remplit dynamiquement une variable de table à l'aide d'une boucle WHILE pour traiter les valeurs séparées par des virgules dans @ExcludedList :

<code class="language-sql">DECLARE @your_list TABLE (list INT)  -- Note: Changed to INT to match Id data type

DECLARE @Value VARCHAR(25)
DECLARE @Pos INT

SET @ExcludedList = '3,4,22' -- Example list

SET @Pos = CHARINDEX(',', @ExcludedList)
WHILE @Pos > 0
BEGIN
    SET @Value = SUBSTRING(@ExcludedList, 1, @Pos - 1)
    INSERT INTO @your_list (list) VALUES (@Value)
    SET @ExcludedList = SUBSTRING(@ExcludedList, @Pos + 1, LEN(@ExcludedList))
    SET @Pos = CHARINDEX(',', @ExcludedList)
END
IF LEN(@ExcludedList) > 0
BEGIN
    INSERT INTO @your_list (list) VALUES (@ExcludedList)
END

SELECT * FROM A WHERE Id NOT IN (SELECT list FROM @your_list)</code>

Comment utiliser :

Après avoir renseigné la variable de table, utilisez-la dans la clause IN :

<code class="language-sql">SELECT * FROM A WHERE Id NOT IN (SELECT list FROM @your_list)</code>

Cela filtre efficacement les lignes en fonction du @your_list contenu. Cette méthode évite les problèmes de conversion de type de données, permettant des requêtes dynamiques avec un nombre variable de valeurs séparées par des virgules. Notez que la colonne list dans @your_list doit correspondre au type de données de la colonne Id dans le tableau A.

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