Поскольку вы упоминаете, что это блокирует другие действия с базой данных, мне кажется, что проблема, с которой вы сталкиваетесь, заключается в том, что ваша вставка в таблицу архива блокирует выбранные записи и блокирует других пользователей. Ваше заявление также может быть заблокировано другими действиями, если оно выполняется в рабочее время.
Я предлагаю пошаговый процесс для перемещения этих записей. Ваши теги указывают, что вы используете SQL Server 2005, который поддерживает предложение OUTPUT, поэтому вы можете удалить старые записи и вставить их в архивную таблицу за один раз. Выберите количество записей, которые кажется разумным делать одновременно, и если вы используете подсказку блокировки READPAST, вы не будете заблокированы для записей, заблокированных другими пользователями. Просто запустите свой пакет столько раз, сколько необходимо, возможно, как запланированное задание. Конечно, убедитесь, что в предложении WHERE выбраны только записи, которые вы хотите заархивировать.
DELETE TOP (10000) FROM dbo.Valid_Date WITH (READPAST)
OUTPUT
DELETED.valid_date, DELETED.valid_date_KEY
INTO dbo.Archive_Of_Valid_Date(valid_date, valid_date_KEY)
WHERE
valid_date < '19800101'
Отредактировано, чтобы расширить комментарий Мэтью к моему ответу
Использование COUNT (*) для определения того, нужно ли выполнять какую-либо работу, не является бесплатным, поэтому большую часть времени вы можете либо использовать EXISTS (который закорачивается, как только будет найдена любая соответствующая запись), либо использовать @@ rowcount после выписок
WHILE (SELECT COUNT() FROM DatabaseA.dbo.table WHERE Condition=1) > 0
BEGIN
DELETE TOP (100) FROM DatabaseA.dbo.table WITH (READPAST)
OUTPUT
DELETED.x, DELETED.y
INTO ArchiveDB.dbo.table(x, y)
WHERE
condition = 1
END
Попытка:
WHILE (1 = 1)
BEGIN
DELETE TOP (100) FROM DatabaseA.dbo.table WITH (READPAST)
OUTPUT
DELETED.x, DELETED.y
INTO ArchiveDB.dbo.table(x, y)
WHERE
condition = 1
IF(@@rowcount <= 0)
break;
END
или
WHILE (EXISTS(SELECT * FROM DatabaseA.dbo.table WHERE Condition=1))
BEGIN
DELETE TOP (100) FROM DatabaseA.dbo.table WITH (READPAST)
OUTPUT
DELETED.x, DELETED.y
INTO ArchiveDB.dbo.table(x, y)
WHERE
condition = 1
END