【问题标题】:SQL query not taking values more than 2100SQL 查询不采用超过 2100 的值
【发布时间】:2010-06-15 21:07:31
【问题描述】:
SELECT MachineID, MachineName, count(ID) as Total, sum(Size) as TotalSize 
  FROM Files 
  join Machines on Files.MachineID = Machines.MachineID 
 Where Files.MachineID In(sql.Append(string.Format("@MachineId{0}", i));
 group by Files.MachineID,MachineName

现在,当 machinId 计数小于 2100 时,将执行查询,如果机器超过 2100,则会引发错误 错误:

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

如何增加限制或避免出现此错误.. 并将值放入 gridview 谢谢..

【问题讨论】:

    标签: c# asp.net sql gridview


    【解决方案1】:

    你没有在你的例子中说你的“sql”变量来自哪里,但是如果你手动构建你的'IN'列表(通过在你的 IN 语句中构建一个带有逗号分隔值的字符串),那么所有流行的关系数据库都有在静态 IN 子句中可以指定多少值的限制。您使用的数据库有 2100 个限制。我相信甲骨文是 1000

    【讨论】:

    • 基本上,我的意思是当你使用像'SELECT * from myTable where ID IN (1,2,3,4,5,....)'这样的语句时。我要说的是 IN 关键字后面的括号内的内容仅限于 2100 个或更少的逗号分隔值。您的代码 'sql.Append(string.Format("@MachineId{0}", i)' 似乎表明您正在循环中构建值列表。我的假设是,当它中断时,“sql”变量有更多超过 2100 个逗号分隔值
    • 好的..是的,这是真的......我知道问题所在,但我该如何摆脱它。>?喜欢有没有办法增加限制或放一个例外(但这仍然无法解决它)或任何其他更酷的方式来做到这一点......虽然感谢您的帮助......不胜感激......
    • 不,没有办法增加 IN 子句的允许大小。您可能需要考虑将数组传递给 SQL 或存储过程,或者在 IN 子句中使用数据之前使用临时表来暂存数据。请参阅此线程以获取想法:stackoverflow.com/questions/1869753/…
    • 嗯...谢谢..我现在需要了解这一点...我从未使用过存储过程...但是我这样做很好..在我这样做之前有任何指针吗??
    • 您确定需要手动传入所有这些machineId 吗?无法join 他们或以其他方式选择他们?是否有用户选择了 2101+ machineId s?存储的例程信息位于dev.mysql.com/doc/refman/5.0/en/stored-routines.html
    【解决方案2】:

    你可以使用字符串函数。在 SQL Server 中,您的 WHERE 子句类似于

    ...WHERE CHARINDEX(':' + <: delimited list of machine IDs> + ':', 
           ':' + CAST(Files.MachineID as VARCHAR(10)) + ':') <> 0
    

    : 分隔符是防止 100 与 1001、1002、2100 等匹配所必需的。示例查询字符串为

    ...WHERE CHARINDEX(':1000:1001:1002:1005:', 
           ':' + CAST(Files.MachineID as VARCHAR(10)) + ':') <> 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2015-08-06
      相关资源
      最近更新 更多