sql查询中的最大参数数

Mar*_*usz 29 c# linq-to-sql

有一段时间我会尝试使用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();
}
Run Code Online (Sandbox Code Playgroud)

有一段时间有一个建议来做到这一点...似乎更聪明的方式:

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();
Run Code Online (Sandbox Code Playgroud)

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

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

几周后,我在搜索应用程序日志文件时看到了什么,并看到了这一点:

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

LINQ to SQL转换where col.Contains(r.ID)IN子句看起来像:
WHERE ID IN(@ p1,@ p1,@ p2 ...)

col集合达到(在我的情况下)超过2100个元素,并且查询无法执行.我已经对这个问题做了一些研究,最后我得到了:

"... sql查询中的最大参数数量是2100.还有更多限制,例如整个查询字符串不能超过8044个字符."

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

我错过了什么?我能做些什么来使用"where col.Contains(r.ID)"版本?

关心马里乌斯

PS.(我使用Win XP,C#with LINQ和SQL 2005 Express).

Mar*_*ell 46

限制是硬编码的:

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

我之前编写了一些代码,将Contains查询分成批处理并合并结果... 请点击此处了解更多信息.

  • 事实证明错误消息/文档是错误的.它们必须有一个检查"> = 2100`而不是> 2100,因为实际限制是2099只是在尝试发送4个参数批次时观察到这一点,这给出了525的偶数大小 (6认同)
  • @JonnyLeeds 有趣;我想知道它是否总是包含返回值的空间(即使不使用),它有点作为参数实现 (2认同)
  • 当 C# 在没有存储过程的情况下调用 SQL Server 时,它使用“sp_executesql”。这意味着您正在为 SQL 语句本身使用一个参数。 (2认同)