Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql批量更新_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql批量更新

Sql批量更新,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,为了在一个事务中限制10k条记录,更新sql server中的表最有效的方法是什么 我通过在while循环中添加top和ROWCOUNT方法来了解它。其中哪一个更有效?或者,如果您知道其他有效方法,请与我们分享。多谢各位 这里有一种不使用 您可以尝试以下方法: WHILE (1=1) BEGIN BEGIN TRANSACTION UPDATE TOP (10000) XXX SET XXX.YYY = <ValueToUpdate> FROM XXX

为了在一个事务中限制10k条记录,更新sql server中的表最有效的方法是什么


我通过在while循环中添加top和ROWCOUNT方法来了解它。其中哪一个更有效?或者,如果您知道其他有效方法,请与我们分享。多谢各位

这里有一种不使用


您可以尝试以下方法:

WHILE (1=1)
BEGIN
   BEGIN TRANSACTION
  UPDATE TOP (10000)  XXX
     SET XXX.YYY = <ValueToUpdate>
    FROM XXX   -- Update 10000 nonupdated rows
   WHERE <condition> -- make sure that condition makes sure that it does not become infinite loop
   IF @@ROWCOUNT = 0
   BEGIN
      COMMIT TRANSACTION
      BREAK
   END
   COMMIT TRANSACTION
END

您目前使用的脚本是什么?不要使用ROWCOUNT来控制如何使用UPDATE语句更新行。它的用法已被弃用,将来将停止使用。您打算一次更新每行10000行,还是只更新前10000行?这将是一个死循环,因为相同的10000行可能会不断更新。至少在sql server中是这样,我没有找到WHERE子句。很抱歉我已经更新了代码。我主要关注的是逻辑。对于表的一般更新,有时可能不存在有效的条件来过滤那些已经更新的。例如,我们有一个表,有两列,[emploee_id]和[salary],也就是说,现在我们想给所有人增加10%,假设这个表有100万行,现在我们想用10K/块更新更新这个表,我们怎样才能得到一个好的where子句呢?我们应该有一个带有UPDATE的OUTPUT子句,将结果存储在一个表变量中,并确保已经更新的行不会再次更新。
WHILE (1=1)
BEGIN
   BEGIN TRANSACTION
  UPDATE TOP (10000)  XXX
     SET XXX.YYY = <ValueToUpdate>
    FROM XXX   -- Update 10000 nonupdated rows
   WHERE <condition> -- make sure that condition makes sure that it does not become infinite loop
   IF @@ROWCOUNT = 0
   BEGIN
      COMMIT TRANSACTION
      BREAK
   END
   COMMIT TRANSACTION
END
DECLARE @updatedids table(id int)
WHILE (1=1)
BEGIN
   BEGIN TRANSACTION
  UPDATE TOP(10000)  a    
     SET a.ModifiedDate = GETDATE()
   OUTPUT inserted.BusinessEntityID INTO @updatedids
    FROM HumanResources.Employee  a
LEFT JOIN @updatedids u
    ON a.BusinessEntityID = u.id
    WHERE u.id IS NULL 
  -- Update 10000 nonupdated rows
   IF @@ROWCOUNT = 0
   BEGIN
      COMMIT TRANSACTION
      BREAK
   END
   COMMIT TRANSACTION
END