SQL Server:如何使用游标删除记录

Ric*_*cky 5 sql sql-server sql-server-2000

我们想要删除表中大量过时的数据,但这会锁定表很长一段时间。是否可以使用 Cursor 在 while 循环中删除每个事务一百条记录?

我可以在哪里参考该示例?

Rob*_*ley 3

像这样的东西:

DECLARE @stillgoing bit;
SET @stillgoing = 1;

WHILE @stillgoing = 1
BEGIN
  DELETE TOP (100) YourTableName
  WHERE IsObsolete = 1;

  IF @@ROWCOUNT = 0
      SET @stillgoing = 0;

  CHECKPOINT /* Will encourage the log to clear if it's in Simple recovery model */
END
Run Code Online (Sandbox Code Playgroud)

编辑:这仅适用于 SQL 2005 及更高版本。正如我们刚刚了解到的,它是 SQL 2000,代码如下:

DECLARE @stillgoing bit
SET @stillgoing = 1

SET ROWCOUNT 100

WHILE @stillgoing = 1
BEGIN
  DELETE YourTableName
  WHERE IsObsolete = 1

  IF @@ROWCOUNT = 0
      SET @stillgoing = 0

  CHECKPOINT /* Will encourage the log to clear if it's in Simple recovery model */
END
Run Code Online (Sandbox Code Playgroud)

并且...简单恢复模型意味着日志将在检查点上截断,而不是仅在备份日志时截断。