Не существует конкретного числа, однако, в документации указано, что у вас, скорее всего, будут проблемы, если у вас есть «тысячи» значений. IN (Transact-SQL) - Примечания :
Явно включать в скобки чрезвычайно большое количество значений (многие тысячи значений, разделенных запятыми) в скобках IN можнопотреблять ресурсы и возвращать ошибки 8623 или 8632. Чтобы обойти эту проблему, сохраните элементы списка IN в таблице и используйте подзапрос SELECT в предложении IN.
Ошибка 8623:
Обработчику запросов не хватило внутренних ресурсов, и он не смог создать план запроса.Это редкое событие и ожидается только для чрезвычайно сложных запросов или запросов, которые ссылаются на очень большое количество таблиц или разделов.Пожалуйста, упростите запрос.Если вы считаете, что получили это сообщение по ошибке, обратитесь в службу поддержки клиентов для получения дополнительной информации.
Ошибка 8632:
Внутренняя ошибка: достигнут предел обслуживания выражений,Пожалуйста, поищите потенциально сложные выражения в вашем запросе и попробуйте упростить их.
Чтобы процитировать мой комментарий, я сделал:
Если вам нужно передать большое количествозначения для запроса, я предлагаю параметр типа таблицы.Но если вам действительно нужно передать значения 1M +, значит, что-то не так с вашим дизайном.Возможно, вам даже лучше перечислить значения, которые вам не нужны.
Редактировать: чтобы добавить к моему комментарию, многие (включая меня) предпочитают использовать EXISTS
вместо IN
.Таким образом, вместо запроса типа:
FROM YourTable YT
WHERE YT.YourColumn IN (SELECT OT.YourColumn
FROM OtherTable OT)
Вы бы запросили:
FROM YourTable YT
WHERE EXISTS (SELECT 1
FROM OtherTable OT
WHERE OT.YourColumn = YT.YourColumn)