Sql Server中的“IN”子句限制

时间:2014-01-17 05:16:01

标签: sql sql-server

有人知道IN子句的表达式列表(测试匹配)中可以有多少值的限制吗?

4 个答案:

答案 0 :(得分:23)

是的,有一个限制,但是MSDN only specifies that it lies "in the thousands"

  

在IN子句中包含极大数量的值(数千个)会占用资源并返回错误8623或8632.要解决此问题,请将项目存储在表中的IN列表中。

详细查看这些错误,我们发现此限制并非特定于IN,但通常适用于查询复杂性:

  

错误8623:

     

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

     

错误8632:

     

内部错误:已达到表达式服务限制。请在查询中查找可能复杂的表达式,并尝试简化它们。

答案 1 :(得分:10)

它不是特定的,但与查询计划生成器超出内存限制有关。我可以确认有几千个它经常出错但可以通过先将值插入表中并将查询重新改写为

来解决。
select * from b where z in (select z from c) 

其中in子句中所需的值位于表c中。我们成功地使用了100万个值的in子句。

答案 2 :(得分:4)

根据您使用的数据库引擎,指令的长度可能会有限制。

SQL Server有一个非常大的限制:

Maximum Capacity Specifications for SQL Server

因此,对于大型IN子句,最好创建临时表,插入值并执行JOIN。它的工作速度也更快。

有一个限制,但您可以将值拆分为in()

的单独块
Select * 
From table 
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)

使用2008年的表值参数,或者这里描述的一些方法

  

Arrays and Lists in SQL Server 2005

答案 3 :(得分:0)

根据您执行查询的方式(JDBC,Hiberante,某种SQL-GUI)以及使用文字值而不是子查询where X in (1, 2, 3...) - 您可能还会遇到以下错误:

  

此RPC请求中提供的参数太多。最高为2100。

因此,在这些情况下,限制将是2100(或者当存在其他参数时甚至更少)。