【问题标题】:Problem updating table using IN clause with huge list of ids使用具有大量 id 的 IN 子句更新表时出现问题
【发布时间】:2011-03-25 09:39:43
【问题描述】:

您好,我在尝试使用 IN 子句更新表时遇到问题,我有一个很大的客户端列表,应该更新 4500+。

Update table 
set columnA = 'value'
where ID in ( biglistofids )  //biglistofids > 4500 ids

我收到此错误 "字符串或二进制数据将被截断。"

我用更少的 id 尝试了相同的脚本,比如说 (2000),它运行良好。

我也尝试过使用临时表,但我遇到了同样的错误。

  1. SELECT Id INTO tmpTable FROM dbo.table WHERE id IN (biglistofids) //create temporal table succesfully
  2. Update table set columnA = 'value' FROM table INNER JOIN tmpTable ON table.ID = tmpTable.ID

有什么方法可以处理这个问题,而无需为每 2000 条记录重复代码?

提前致谢

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql in-clause


    【解决方案1】:

    "String or binary data would be truncated."IN 子句无关。

    这行的意思是:

    set columnA = 'value' 
    

    您将 columnA 设置为太长而无法在 columnA 中保存的内容。

    可能某些ids对应的数据太长了,这些不在你尝试过的前2000个中。

    【讨论】:

    • +1:我在 SQL Server 2005 上重现了该错误,试图将“abcdef”放入 NVARCHAR(5) 列中。
    • +1 同意消息与IN子句的大小无关
    【解决方案2】:

    根据您的错误,我认为实际问题出在您正在更新的一个或多个值上。首先,我会尝试验证输入。我已经根据我拥有的记录数量、value 的大小、value 的类型等做了很多方法,所以这取决于你的具体情况。

    最直接的(不一定是最好的)就是您描述的那个。尝试执行 2000。如果可行,请尝试下一个 2000,等等。这既费时又笨重,可能不是最适合您的情况,但我从未见过它无法识别我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 2020-10-09
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      相关资源
      最近更新 更多