具有“Where”的查询的“in”关键字中的最大元素数是多少

时间:2013-05-16 14:52:58

标签: c# sql sql-server

我有两个查询访问两个不同的SQL Server以避免链接服务器通信。 第一个查询得到一个OrderID列表,我使用c#将它们组织成一个传递给第二个查询的字符串,如下面的格式:

Select .....
From .....
Where OrderID in (1,2,3,4,5,6)

- 1,2,3,4,5,6是第一次查询结果的过程。

我发现如果从第一个查询中检索到很多orderID,则第二个查询将超时。

有没有什么元素可以传递给“IN”条款?

3 个答案:

答案 0 :(得分:3)

如果您需要传递这么多元素,这会成为一个问题,您应该考虑使用已定义的table valued parameter作为参数的存储过程(应该包含您的列表)。

编辑:请参阅http://blogs.msdn.com/b/felixmar/archive/2010/10/27/how-to-create-and-execute-a-stored-procedure-using-a-table-as-a-parameter.aspx

答案 1 :(得分:1)

有一个硬限制,但它非常高。如果你达到了这个限制,虽然它不会超时,而是拒绝让你进行查询。

在您的情况下,查询只需要很长时间才能运行。但是'in'数组中的项目越多,查询执行所需的时间就越长,因为它还有更多工作要做。如果您的查询时间过长,则会在您找到时超时。

这不是限制,而是容差。

您应该尝试做的是对查询进行分页,这样您就可以一次将其限制为100行左右并进行多次查询。

您可能还想考虑使用像Entity Framework这样的ORM(你已经有了C#标签,但是这里没有C#,所以我假设你就是这样) - 那么它看起来像这样:

Orders.Where(o => OrderIDs.Contains(o.OrderID)).Skip(100).Take(100);

这是我个人的偏见,虽然对你是否有好处而言是如此苛刻。

答案 2 :(得分:-1)

它是2100个元素。请参阅documentation