Самый простой способ сделать это с помощью запроса, который использует полностью определенные имена
INSERT INTO ArchiveDatabase..TableName
SELECT *
FROM ProductionDatabase..TableName
WHERE EntryDate <= dateadd(mm, -6, current_timestamp)
Чтобы скопировать большие объемы данных, часто лучше сделать это "на основе чанков".Самый простой способ сделать это в чистом TSQL выглядит следующим образом:
DECLARE @rowcount int
SET @rowcount = 1
WHILE @rowcount <> 0
BEGIN
INSERT INTO ArchiveDatabase..TableName
SELECT TOP (100000) *
FROM ProductionDatabase..TableName
WHERE EntryDate <= dateadd(mm, -6, current_timestamp)
SET @rowcount = @@ROWCOUNT
END
В основном ограничьте запрос до 100 тыс. Строк с помощью предложения SELECT TOP()
и продолжайте цикл, пока не будет скопировано больше записей.(@@ROWCOUNT
возвращает количество затронутых записей.)
Если базы данных расположены на разных серверах SQL, вы можете настроить «Связанный сервер» и добавить ссылку на сервер к имени объекта.Формат полного имени объекта: <Server>.<Database>.<Owner>.<Object>