我有两个查询访问两个不同的 SQL Server 以避免链接服务器通信。第一个查询得到一个 OrderID 列表,我使用 c# 将它们组织成一个字符串传递给第二个查询,如下格式:
Select .....
From .....
Where OrderID in (1,2,3,4,5,6)
-- 1,2,3,4,5,6 是第一次查询结果的过程。
我发现如果从第一个查询中检索到很多 orderID,第二个查询将超时。
有没有什么做法可以将多少元素传递给“IN”子句?
我有两个查询访问两个不同的 SQL Server 以避免链接服务器通信。第一个查询得到一个 OrderID 列表,我使用 c# 将它们组织成一个字符串传递给第二个查询,如下格式:
Select .....
From .....
Where OrderID in (1,2,3,4,5,6)
-- 1,2,3,4,5,6 是第一次查询结果的过程。
我发现如果从第一个查询中检索到很多 orderID,第二个查询将超时。
有没有什么做法可以将多少元素传递给“IN”子句?
如果您需要传递如此多的元素以至于这成为一个问题,您应该考虑使用定义table valued parameter
为参数的存储过程(它应该包含您的列表)。
有一个硬限制,但它非常高。如果您达到该限制,尽管它不会超时,而是根本拒绝让您进行查询。
在您的情况下,查询运行时间太长。但是你的'in'数组中的项目越多,你的查询执行的时间就越长,因为它有更多的事情要做。如果您的查询花费的时间太长,您会发现它会超时。
这不是关于限制,而是关于公差。
您可能应该尝试对查询进行分页,以便一次将其限制为 100 行左右并执行多个查询。
您可能还想考虑使用像实体框架这样的 ORM(您有 C# 标签,但这里没有 C#,所以我假设这就是您所在的位置) - 然后它看起来像这样:
Orders.Where(o => OrderIDs.Contains(o.OrderID)).Skip(100).Take(100);
这是我个人的偏见,尽管对于你这样做是否有益。
这是2100个元素。请参阅文档。