Ограничение предложения "IN" на сервере Sql

Кто-нибудь знает, каков предел количества значений, которые можно получить в списке выражений (чтобы проверить соответствие) для предложения IN?

Ответ 1

Да, есть предел, но MSDN указывает только, что он находится в тысячах:

Включение чрезвычайно большого количества значений (много тысяч) в предложение IN может потреблять ресурсы и возвращать ошибки 8623 или 8632. Чтобы обойти эту проблему, сохраните элементы в списке IN в таблице.

Внимательно изучив эти ошибки, мы видим, что это ограничение не относится к IN, но относится к сложности запроса в целом:

Ошибка 8623:

Обработчик запросов исчерпал внутренние ресурсы и не смог создать план запроса. Это редкое событие и ожидается только для чрезвычайно сложных запросов или запросов, которые ссылаются на очень большое количество таблиц или разделов. Пожалуйста, упростите запрос. Если вы считаете, что получили это сообщение по ошибке, обратитесь в Службу поддержки клиентов за дополнительной информацией.

Ошибка 8632:

Внутренняя ошибка: достигнут лимит служб выражений. Пожалуйста, найдите потенциально сложные выражения в своем запросе и попробуйте упростить их.

Ответ 2

Это не является специфическим, а связано с генератором плана запроса, превышающим пределы памяти. Я могу подтвердить, что с несколькими тысячами он часто принимает ошибки, но может быть разрешен путем вставки значений в таблицу сначала и перефразировать запрос как

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

где значения, которые вы хотите в разделе in, приведены в таблице c. Мы использовали это успешно с пунктом в 1 миллион.

Ответ 3

В зависимости от используемого вами механизма базы данных могут быть ограничения на длину инструкции.

SQL Server имеет очень большой предел:

Максимальная емкость для SQL Server

Итак, для больших предложений IN лучше создать временную таблицу, вставить значения и сделать JOIN. Он работает быстрее.

Существует предел, но вы можете разделить свои значения на отдельные блоки in()

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

используйте параметр таблицы, оцененный в 2008 году, или какой-либо описанный здесь подход

Массивы и списки в SQL Server 2005

Ответ 4

В зависимости от того, как вы выполняете запрос (JDBC, Hiberante, какой-то SQL-GUI) и при использовании литеральных значений вместо подзапроса where X in (1, 2, 3...) вы также можете столкнуться со следующей ошибкой:

В этом запросе RPC было предоставлено слишком много параметров. Максимум 2100.

Таким образом, в этих случаях предел будет 2100 (или даже меньше, если присутствуют другие параметры).