【问题标题】:Error converting data type varchar to bigint - IN clause将数据类型 varchar 转换为 bigint 时出错 - IN 子句
【发布时间】:2015-03-08 20:37:04
【问题描述】:

我正在尝试创建一个DELETE 语句,我将使用IN 子句从基于ID 列表的表中删除一些项目:

DELETE FROM table WHERE id IN (@ids)

使用SqlCommand,我正在执行以下操作来生成IN 参数:

public void DeleteItemsByIds(int[] ids) {

    Parameters["ids"] = string.Join(", ", ids);
    ExecuteNonQuery(deleteStatement, Parameters);
}

然后我得到一个错误:

将数据类型 varchar 转换为 bigint 时出错

有人知道我该如何解决吗?

谢谢大家!

【问题讨论】:

  • 好吧,IN 需要一个 (大概)BIGINT 值列表,而您提供的实际上只是 一个字符串 b> ..... 对于 SQL Server 2008 及更高版本,请查看 表值参数 以将多个值传递给 SQL 语句
  • 将整个 SQL 语句构造为文本,而不仅仅是包含集,这应该可以。
  • @PieterGeerkens:这是可怕的建议,因为它开启了 SQL 注入 攻击的可能性……说真的 - 不要这样做!
  • 看看this SO回答。它是针对存储过程量身定制的,但建议的解决方案适合您的情况。此外,您可能会得到一些提示,将您推向存储过程而不是独立的(动态 sql?)删除语句...

标签: c# sql sql-server


【解决方案1】:

in 需要一个左侧和右侧类型兼容的事物列表。显然in 的左侧是数字,右侧是字符串。而且,您不能将字符串转换为数字,因为它是一个逗号分隔的列表。

快速而肮脏的解决方案是简单地使用like

DELETE
    FROM table
    WHERE ',' + @ids + ',' LIKE '%,' + CAST(id as VARCHAR(255)) + ',%';

但是,这在性能方面并不理想,因为它无法使用id 上的索引。更好的解决方案需要更多地了解使用 SQL 的应用程序。

【讨论】:

    【解决方案2】:

    这肯定会对你有所帮助

    select * from tblusers where userid in(select value from String_Split('1,2,3,4',','))
    

    String_Split 是一个内置的 SQL 函数

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多