查询处理器的内部资源不足要在通配符中使用IN(tsql)的解决方法?

时间:2019-07-02 14:59:42

标签: sql sql-server tsql

我需要在数据库中找到大量的值。

以下是数据的外观:

0054321
54321
999
999  - HALLO?
54321 Hallo?
000054321

因为这是一次性的事情,所以我认为我只是使用OR和LIKE进行一个非常长的查询来搜索数据:

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

想象一下,但是OR为80k。在这种情况下,SQL Server将遇到以下问题:

  

查询处理器用尽了内部资源,无法生成查询计划。这是罕见的事件,仅在极其复杂的查询或引用大量表或分区的查询中才会发生。请简化查询。如果您认为收到此消息是错误的,请联系客户支持服务以获取更多信息。

作为一种解决方法,我读到您应该声明一个临时表并将值放在其中,然后使用“ IN”进行搜索-但我必须使用LIKE进行搜索,以便能够使用通配符。

有人知道如何解决或解决此问题吗?

我不想使用同一方法将命令拆分为多个命令。

感谢您的建议!

1 个答案:

答案 0 :(得分:0)

您仍然可以使用临时表。

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

x是该字段来自哪个表的别名。

或者:

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

取决于是否要存储通配符。