Limitação da cláusula " IN " no servidor Sql

Alguém sabe qual é o limite para o número de valores que se pode ter numa lista de expressões (para testar uma correspondência) para a cláusula IN?

Author: MSanika, 2014-01-17

4 answers

Sim, há um limite, mas MSDN só especifica que ele está "nos milhares":

A inclusão de um número extremamente elevado de valores (muitos milhares) numa cláusula IN pode consumir recursos e devolver erros 8623 ou 8632. Para trabalhar em torno deste problema, armazene os itens na lista em uma tabela.

Olhando para esses erros em detalhes, vemos que este limite não é específico a IN mas aplica-se à complexidade da consulta em geral:

Erro 8623:

O processador de consulta ficou sem recursos internos e não conseguiu produzir um plano de consulta. Este é um evento raro e esperado apenas para consultas ou consultas extremamente complexas que referenciam um grande número de tabelas ou partições. Por favor simplifique a consulta. Se acreditar que recebeu esta mensagem por engano, contacte o serviço de Apoio ao cliente para obter mais informações.

Erro 8632:

erro interno: um limite de serviços de expressão tem foi atingido. Por favor, procure expressões potencialmente complexas em sua consulta, e tente simplificá-las.

 15
Author: Heinzi, 2014-01-17 06:26:39

Não é específico, mas está relacionado com o gerador de plano de consulta excedendo os limites de memória. Posso confirmar que com vários milhares de erros muitas vezes, mas pode ser resolvido inserindo os valores em uma tabela primeiro e reformular a consulta como

select * from b where z in (select z from c) 

Onde os valores que você deseja na cláusula in estão na tabela C. Nós usamos isso com sucesso com uma cláusula in de 1 milhão de valores.

 6
Author: Nick van Esch, 2014-11-11 05:17:29

Dependendo do motor de banco de dados que você está usando, pode haver limites no comprimento de uma instrução.

O servidor SQL tem um limite muito grande:

Especificações de capacidade máxima para o servidor SQL

Então, para grandes cláusulas, é melhor criar uma tabela temporária, inserir os valores e fazer uma junção. Também funciona mais depressa.

Existe um limite, mas pode dividir os seus valores em blocos separados de in ()

Select * 
From table 
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)

Utilizar um parâmetro do valor da tabela em 2008, ou alguma abordagem descrita aqui

Arrays e listas no servidor SQL 2005

 3
Author: Amarnath Balasubramanian, 2014-01-17 05:30:11

Dependendo de como executa a consulta (JDBC, Hiberante, algum tipo de SQL-GUI) e ao usar valores literais em vez de uma sub-consulta where X in (1, 2, 3...) - Poderá também encontrar o seguinte erro:

Foram fornecidos demasiados parâmetros neste pedido RPC. O máximo é 2100.

Então o limite seria 2100 (ou ainda menos quando outros parâmetros estão presentes, também) nesses casos.

 0
Author: icyerasor, 2017-07-13 13:43:08