我正在编写一个进程,根据日期时间列归档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)
但后来我意识到我无法保证我删除的行是我刚刚备份的行.或者我可以......?
更新: 我考虑的另一个选择是添加一个步骤:
有没有人知道这个系列的费用如何与下面讨论的其他一些选项相比较?
详细信息:我正在使用SQL 2005,因为有人问.