sql查询中的最大参数数

时间:2009-05-10 19:24: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();
}

有些时候,我有一个建议来做到这一点...似乎更聪明的方式:

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();

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

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

在搜索应用程序日志文件几周后,我感到惊讶的是:

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

LINQ to SQL将where col.Contains(r.ID)转换为IN子句,如下所示:     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)。

1 个答案:

答案 0 :(得分:44)

限制are hard-coded

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

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