相关疑难解决方法(0)

以有限(1000行)块的形式移动SQL Server数据

我正在编写一个进程,根据日期时间列归档SQL Server表中的行.我想在X之前移动所有具有日期的行,但问题是每个日期有数百万行,因此对每个日期执行BEGIN TRANSACTION ... INSERT ... DELETE ... COMMIT需要太长时间,并为其他用户锁定数据库.

有没有办法可以用更小的块来做到这一点?也许使用ROWCOUNT或类似的东西?

我原本考虑过这样的事情:

SET ROWCOUNT 1000

DECLARE @RowsLeft DATETIME
DECLARE @ArchiveDate DATETIME

SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)

WHILE @ROWSLEFT IS NOT NULL
BEGIN

    INSERT INTO EventsBackups
    SELECT top 1000 * FROM Events

    DELETE Events

    SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)

END
Run Code Online (Sandbox Code Playgroud)

但后来我意识到我无法保证我删除的行是我刚刚备份的行.或者我可以......?

更新: 我考虑的另一个选择是添加一个步骤:

  1. 将符合我的日期条件的TOP 1000行选入临时表
  2. 开始交易
  3. 从临时表插入存档表
  4. 从源表中删除,连接到每列的临时表
  5. 提交交易
  6. 重复1-5,直到没有符合日期条件的行

有没有人知道这个系列的费用如何与下面讨论的其他一些选项相比较?

详细信息:我正在使用SQL 2005,因为有人问.

sql-server insert rowcount

12
推荐指数
1
解决办法
1万
查看次数

标签 统计

insert ×1

rowcount ×1

sql-server ×1