gpt4 book ai didi

c# - sql查询中的最大参数个数

转载 作者:IT王子 更新时间:2023-10-29 04:12:43 25 4
gpt4 key购买 nike

我从一段时间以来就开始尝试使用 LINQ。在我的代码中枚举集合并更改其某些属性的典型方法如下所示:

ATDataContext dc = new ATDataContext(Settings.connection_string);

int[] col = ListViewClass.getListViewSelectedPositionTags(listView);

try
{
foreach (var item in col)
{
var ctx = (from r in dc.MailingLists
where r.ID == item
select r).Single();

ctx.Excluded = 'Y';
ctx.ExcludedComments = reason;
}

dc.SubmitChanges();
}

后来我得到了一个建议,通过......看起来更聪明的方式来做到这一点:

var ctx = from r in dc.MailingLists
where col.Contains(r.ID)
select r;

foreach (var item in ctx)
{
item.Excluded = 'Y';
item.ExcludedComments = reason;
}

dc.SubmitChanges();

它在很多层面上都很有意义,我喜欢这个解决方案。它比第一个更聪明、更快。

我已经在生产环境中使用这个解决方案一段时间了。

几周后搜索应用程序日志文件并看到这个时,我感到很惊讶:

“传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议(protocol)流不正确。此 RCP 请求中提供的参数过多。最大值为 2100。”

LINQ to SQL 将 where col.Contains(r.ID) 转换为 IN 子句,如下所示:
ID 在 (@p1, @p1, @p2 … )

col 集合达到(在我的例子中)超过 2100 个元素,查询无法执行。我对这个问题做了一些研究,结果是:

“……sql 查询中参数的最大数量是 2100。还有更多的限制,比如整个查询字符串不能超过 8044 个字符。”

我非常喜欢第二种解决方案。我对 SQL Server 的这些硬编码限制感到非常失望。

我错过了什么吗?我可以做些什么来使用“where col.Contains(r.ID)”版本?

问候马吕斯

附言。 (我使用 Win XP、C# 以及 LINQ 和 SQL 2005 Express)。

最佳答案

极限 are hard-coded :

  • 每个存储过程的参数 2,100
  • 每个用户定义函数的参数 2,100

我之前写了一些代码,将 Contains 查询拆分为多个批处理并合并结果... see here for more .

关于c# - sql查询中的最大参数个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/845931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com