Если вам действительно нужны тысячи условий для запроса, и вы не можете упростить его с помощью диапазонов, вы можете попытаться объединить временную таблицу. Создайте временную таблицу со значениями в ней, а затем добавьте INNER к ней в своем запросе, которая отфильтрует эти значения в таблице.
из чего-то вроде (только предположение, OP не предоставил пример кода):
SELECT
*
FROM MyTale
WHERE (a=5 AND b='apple' AND c=1024)
OR (a=3 AND b='pear' AND c=2048)
OR (a=8 AND b='apple' AND c=2048)
....
до:
CREATE TABLE #TempJoin
(a int
,b char(10)
,c int
)
INSERT INTO #TempJoin VALUES (5,'apple',1024)
INSERT INTO #TempJoin VALUES (3,'pear',2048)
INSERT INTO #TempJoin VALUES (8,'apple',2048)
....
SELECT
m.*
FROM MyTale m
INNER JOIN #TempJoin t ON m.a=t.a AND m.b=t.b AND m.c=t.c
РЕДАКТИРОВАТЬ на основе редактирования ОП ...
Я все еще очень озадачен "почему" так много условий. Я просто не могу себе представить, почему, не могли бы вы немного рассказать о природе проблемы, которую вы пытаетесь решить?
Откуда все все значения, используемые в условиях? пользовательский ввод, файл, другая таблица базы данных?
Может существовать очень простое решение, которое предполагает выполнение действий по-другому, в результате чего нет необходимости иметь тысячи условий в вашем запросе.
Единственный способ решить вашу проблему (как представлено) - сохранить ваши условия в виде строк в двух таблицах: RowsToKeep и RowsToRemove. Вы можете использовать обычные таблицы, таблицы #temp или таблицы ## globalTemp. Вы не даете достаточно информации, чтобы рекомендовать, какой из них использовать (как часто выполняется этот запрос? Будет ли одновременно выполняться несколько похожих запросов и т. Д.). В моем примере кода я буду использовать обычную таблицу и предположим, что ничто не помешает обычным таблицам (никто другой не будет пытаться использовать / изменять RowsToKeep и RowsToRemove, пока этот запрос готовится или выполняется).
CREATE TABLE RowsToKeep
(a int --you don't say the data type, but you can make these anything
,b char(10) --you don't say the data type, but you can make these anything
)
CREATE TABLE RowsToRemove
(c int --you don't say the data type, but you can make these anything
)
Для такого запроса, как вы описали, я бы предположил, что вы строите его динамически, используя циклы. Сначала TRUNCATE или DELETE для двух таблиц, а затем по мере зацикливания INSERT INTO этих таблиц вместо построения условий динамического запроса. После вставки всех значений вы можете использовать следующий простой запрос, который будет функционировать так же, как ваш оригинал, но не будет ограничен количеством условий:
SELECT
...
FROM TABLE t
INNER JOIN RowsToKeep k ON t.Column2=k.a AND t.Column3=k.b
LEFT OUTER JOIN RowsToRemove r ON t.Column1=r.a
WHERE r.a IS NULL