Sql Server中的"IN"子句限制

MSa*_*ika 30 sql sql-server

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

Hei*_*nzi 28

是的,有一个限制,但MSDN只指定它是"成千上万":

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

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

错误8623:

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

错误8632:

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


Nic*_*sch 12

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

select * from b where z in (select z from c) 
Run Code Online (Sandbox Code Playgroud)

in子句中所需的值在表c中.我们成功使用了100万个值的in子句.


icy*_*sor 7

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

此 RPC 请求中提供了太多参数。最大值为 2100。

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


Ama*_*ian 6

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

SQL Server有一个很大的限制:

SQL Server的最大容量规格

因此,对于大的IN子句,最好创建一个临时表,插入值并执行JOIN。它也可以更快地工作。

有一个限制,但是您可以将值拆分为in()的单独块

Select * 
From table 
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)
Run Code Online (Sandbox Code Playgroud)

在2008年使用表值参数或此处介绍的某些方法

SQL Server 2005中的数组和列表