【问题标题】:maximum number of parameters in sql querysql查询中的最大参数数
【发布时间】:2009-05-10 19:24:29
【问题描述】:

我从一段时间以来一直在尝试使用 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) 协议流不正确。此 RCP 请求中提供的参数过多。最大值为 2100。”

LINQ to SQL 将 where col.Contains(r.ID) 转换为 INclause 看起来像:
ID 在哪里(@p1、@p1、@p2 ...)

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

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

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

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

问候 马吕斯

ps。 (我使用 Win XP、C# 和 LINQ 和 SQL 2005 Express)。

【问题讨论】:

  • 道歉。我没有设法格式化代码示例。如果有人可以提供帮助,我将不胜感激......
  • 格式化;您可以在编辑器中使用“代码”和“引用”按钮来执行此操作。
  • I have loved the second solution so much: "爱过又失去,总比从来没有爱过要好"

标签: c# linq-to-sql


【解决方案1】:

限制are hard-coded

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

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

【讨论】:

  • 原来错误消息/文档是错误的。他们必须检查 >= 2100 而不是 > 2100,因为实际限制是 2099 只是在尝试发送 4 个参数批次时观察到这一点,这给出了 525 的偶数大小
  • @JonnyLeeds 很有趣;我想知道它是否总是包含返回值的空间(即使不使用),这有点作为参数实现
  • 是的,可能。那里的文档只特别提到了函数和存储过程,而我只是运行了一大组插入,但是运行 command.Execute[Blah](在 c# 中)的异常也提到了 2100
  • 当 C# 调用没有存储过程的 SQL Server 时,它使用sp_executesql。这意味着您为 SQL 语句本身使用了一个参数。
  • @Jonathan 如果是这种情况,它将使用 2 - 一个用于 SQL,一个用于 params 定义参数;不过,我不认为它实际上是在 TDS 级别上发布的 - 但我可能错了,我已经有一段时间没有涉足原始 TDS
猜你喜欢
  • 2011-04-30
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多