Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Alternativa ao operador IN com variável e entre


Você pode declarar uma variável de tabela (ou parâmetro se for parte de um procedimento ou função) e usá-la para o not in papel:
DECLARE @NotIn table (
    NotInValues int
)

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

e use-o em seu código assim:
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    

Observação nº 1: para um grande número de valores, não existe provavelmente terá um desempenho melhor do que não em

Observação nº 2: Se for parte de um procedimento armazenado, você precisará criar um tipo de tabela definido pelo usuário e usá-lo para declarar o parâmetro com valor de tabela. Além disso, os parâmetros com valor de tabela são somente leitura, portanto, executar instruções DML (inserir/atualizar/excluir) neles gerará um erro.

Para criar o udt:
CREATE TYPE IntegerList As Table
(
    IntValue int
)

Para declará-lo na lista de parâmetros do procedimento armazenado:
CREATE PROCEDURE procedureName
(
   @IntList dbo.IntegerList READONLY
   -- Note that the readonly must be a part of the parameter declaration.
)