使用具有大量id列表的IN子句更新表的问题

时间:2010-08-04 17:36:57

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

您好我在尝试使用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
  3. 有没有办法处理这个问题,而不重复每条2000条记录的代码?

    提前致谢

2 个答案:

答案 0 :(得分:7)

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

这意味着在这一行:

set columnA = 'value' 

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

也许某些id的对应数据太长了,而且这些数据不是您尝试的第一个。

答案 1 :(得分:0)

根据您的错误,我认为实际问题是您正在更新的一个或多个值。我首先尝试验证输入。我根据记录的数量,value的大小,value的类型等完成了很多方法,这取决于您的具体情况。

最直接的(不是最好的)是你描述的那个。尝试做2000.如果有效,请尝试下一个2000,等等。这是时间密集和笨重,可能不是最适合你的情况,但我从来没有看到它无法确定我的问题。