Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Alternative SQL à l'opérateur IN avec variable et entre

Vous pouvez déclarer une variable de table (ou un paramètre si elle fait partie d'une procédure ou d'une fonction) et l'utiliser pour le not in partie :

DECLARE @NotIn table (
    NotInValues int
)

INSERT INTO @NotIn Values
('00009000'),
('00009900'),
('00009906')

et utilisez-le dans votre code comme ceci :

where [Location Code] between '0000' and '0040' 
and [Item No_] not IN (select NotInValues from @NotIn) 
and Gutschrift = '1' 
and [Document Date] between @Start and @Ende    

Remarque 1 : pour un grand nombre de valeurs, not exists fonctionnera probablement mieux que not in

Remarque n° 2 : S'il fait partie d'une procédure stockée, vous devrez créer un type de table défini par l'utilisateur et l'utiliser pour déclarer le paramètre de valeur table. De plus, les paramètres de table sont en lecture seule, donc l'exécution d'instructions DML (insertion/mise à jour/suppression) sur eux générera une erreur.

Pour créer l'udt :

CREATE TYPE IntegerList As Table
(
    IntValue int
)

Pour le déclarer dans la liste des paramètres de la procédure stockée :

CREATE PROCEDURE procedureName
(
   @IntList dbo.IntegerList READONLY
   -- Note that the readonly must be a part of the parameter declaration.
)