Процессор запросов исчерпал внутренние ресурсы | Обходной путь для использования IN (TSQL) с подстановочными знаками? - PullRequest
1 голос
/ 02 июля 2019

Мне нужно найти большое количество значений в моей базе данных.

Ниже приведены данные, которые могут выглядеть:

0054321
54321
999
999  - HALLO?
54321 Hallo?
000054321

Поскольку это единовременно, я подумал, что просто сделаю действительно длинный запрос, просматривая данные, используя OR и LIKE:

... WHERE ' ' + FLD1 + ' ' LIKE '%54321 %' 
OR        ' ' + FLD1 + ' ' LIKE '%999 %' 
OR ...

Вообразите это, но с 80k ИЛИ. В этом случае SQL Server столкнется со следующей проблемой:

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

В качестве обходного пути я прочитал, что вы должны объявить временный TABLE и поместить туда свои значения, а затем выполнить поиск с помощью 'IN' - но я должен искать с помощью LIKE, чтобы иметь возможность использовать подстановочные знаки ,

У кого-нибудь есть идеи, как решить или обойти эту проблему?

Я не хочу разбивать команду на несколько команд одним и тем же методом.

Спасибо за ваши предложения!

1 Ответ

0 голосов
/ 02 июля 2019

Вы все еще можете использовать временную таблицу.

where exists (select 1
              from patterntable pt
              where ' ' + x.field1 + ' ' like pt.pattern
             )

x - псевдоним для любой таблицы, из которой происходит поле.

Или:

              where ' ' + x.field1 + ' ' like '% ' + pt.pattern + ' %'

в зависимости от того, хотите ли вы использовать подстановочные знаки или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...