Sql批量更新
为了在一个事务中限制10k条记录,更新sql server中的表最有效的方法是什么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
我通过在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