2014-01-17 209 views
12

有沒有人知道IN子句的表達式列表(可以測試匹配項)中可以有多少值的限制?Sql Server中的「IN」子句限制

+0

http://msdn.microsoft.com/en-us/library/ms143432.aspx – xdazz

+8

你永遠不應該寫代碼讓你在任何地方接近極限,因爲在(aa,a2,...,an)隨着n的增長變得非常低效 - 你應該儘可能通過更好的機制來控制你的查詢選擇,例如等同存在的條款 –

+0

它只是一個面試問題...因爲我不覺得在實際的世界裏,你會有任何情況下,找到匹配組可以接近大小 – Dhaval

回答

13

是一些方法,有一個限制,但是MSDN only specifies that it lies "in the thousands"

Including an extremely large number of values (many thousands) in an IN clause can consume resources and return errors 8623 or 8632. To work around this problem, store the items in the IN list in a table.

看看這些錯誤的細節,我們看到,這個限制不是針對IN但一般應用於查詢的複雜性:

Error 8623:

The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

Error 8632:

Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.

3

根據您使用的數據庫引擎,指令長度可能有限制。

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

Maximum Capacity Specifications for SQL Server

因此,對於大IN子句,最好創建一個臨時表,插入值,做一個JOIN。它的工作速度也更快。

有一個限度,但你可以在你的價值觀分成單獨的塊()

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

使用2008表值參數,或者在這裏描述

Arrays and Lists in SQL Server 2005

4

這是不特定的,但相關的查詢計劃產生超過內存限制。我可以證實,幾千上萬,經常出錯,但可以通過先插入值到一個表來解決,在這裏你的條款是在表C所需的值改寫查詢作爲

select * from b where z in (select z from c) 

。我們成功地使用了一個1百萬個值的in子句。

0

取決於你如何執行查詢(JDBC,的Hiberante,某種SQL-GUI)和使用的,而不是一個子查詢where X in (1, 2, 3...)文字值的時候 - 你也可能會遇到以下錯誤:

Too many parameters were provided in this RPC request. The maximum is 2100.

因此,在這些情況下,限制將會是2100(或者在其他參數存在的情況下甚至更少)。