在SQL中更新200k记录失败

时间:2017-10-26 17:15:10

标签: sql sql-server sql-server-2012

我正在尝试使用SQL中的以下查询更新200k记录:

UPDATE [ExampleDb].[dbo].[Contacts]
  SET Type_ID = 2
  WHERE [Company] = 0 AND (Type_ID != 2 OR Type_ID IS NULL);

当查询在25秒内完成时,我收到以下消息:

(195304 row(s) affected)

(0 row(s) affected)

(0 row(s) affected)

(0 row(s) affected)

(0 row(s) affected)

(0 row(s) affected)

此后不会更新任何记录。然后我将查询限制为更新几条或一条记录,例如:

UPDATE [ExampleDb].[dbo].[Contacts]
  SET Type_ID = 2
  WHERE Email_Address LIKE '%amazon.com%' 
  AND  [Company] = 0 AND (Type_ID != 2 OR Type_ID IS NULL);

运行时,会正确更新60条记录。

我不确定如何开始解决此问题。 SQL仅限于简单UPDATE上的x条记录吗?我该如何解决这个问题?我应该编写一个循环来一次更新10%的记录或者这些行吗?

1 个答案:

答案 0 :(得分:1)

事实上,这是由触发器引起的。我suppressed the trigger并且它有效(显然你想知道为什么触发器已经到位)。工作代码如下所示:

ALTER TABLE [ExampleDb].[dbo].[Contacts] DISABLE TRIGGER trigger_Name

  UPDATE [ExampleDb].[dbo].[Contacts]
    SET Type_ID = 2
    WHERE [Company] = 0 AND (Type_ID != 2 OR Type_ID IS NULL);

ALTER TABLE [ExampleDb].[dbo].[Contacts] ENABLE TRIGGER 
trigger_Name

关于不起作用的事情的附注:我试图在BEGIN TRANSACTIONCOMMIT中包装代码以在任何触发器启动之前提交事务,如下所示:

BEGIN TRANSACTION
  UPDATE [ExampleDb].[dbo].[Contacts]
    SET Type_ID = 2
    WHERE [Company] = 0 AND (Type_ID != 2 OR Type_ID IS NULL);
COMMIT;

这不起作用。