Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Alternative zum IN-Operator mit Variable und zwischen

Sie können eine Tabellenvariable (oder einen Parameter, wenn er Teil einer Prozedur oder Funktion ist) deklarieren und für not in verwenden Teil:

DECLARE @NotIn table (
    NotInValues int
)

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

und verwenden Sie es wie folgt in Ihrem Code:

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    

Anmerkung 1: für eine große Anzahl von Werten wird notexists wahrscheinlich besser abschneiden als notin

Anmerkung 2: Wenn es Teil einer gespeicherten Prozedur ist, müssen Sie einen benutzerdefinierten Tabellentyp erstellen und ihn verwenden, um den Tabellenwertparameter zu deklarieren. Außerdem sind Tabellenwertparameter schreibgeschützt, sodass die Ausführung von DML-Anweisungen (Einfügen/Aktualisieren/Löschen) für sie einen Fehler auslöst.

So erstellen Sie die UDT:

CREATE TYPE IntegerList As Table
(
    IntValue int
)

So deklarieren Sie es in der Parameterliste der gespeicherten Prozedur:

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