Использование большого списка IN
не обязательно плохо, но вы можете столкнуться с проблемами, если у вас есть тысячи элементов в списке, так как указатель параметров может вызвать проблемы.
Но, в принципе, другой подход состоит в том, чтобы присоединиться к некоторой (временной) таблице.Однако использование этой стратегии потребует от вас вставки данных в таблицу, поэтому, если вы не сможете многократно использовать запрос, работа, связанная с вставкой данных фильтра, в значительной степени превысит работу по возвращению результатов.
Лучшим советом здесь, как и везде, будет поиск результатов в анализаторе запросов.
Пример второго подхода с использованием временной таблицы показан ниже.Здесь вы можете получить преимущество от использования индексов в JOIN, но это следует сопоставить со стоимостью вставок для каждого значения фильтра и сложностью в коде, использующем функцию фильтра.(Простое предложение IN
автоматически сгенерировано LINQ, в то время как подход к временным таблицам потребует некоторого сокращения в коде.)
CREATE TABLE vals (v nvarchar(255), inserted DATETIME DEFAULT(getdate()))
SELECT * FROM vals
WHERE v IN ('a', 'aa', 'aaa')
DECLARE @filters TABLE (v varchar(256))
INSERT INTO @filters (v) VALUES ('a')
INSERT INTO @filters (v) VALUES ('aa')
INSERT INTO @filters (v) VALUES ('aaa')
SELECT * FROM vals INNER JOIN @filters f
ON f.v = vals.v