Просто повторите ваш код 12 раз с предложением where, используя month () и другую целевую таблицу. Я знаю, что копировать и вставлять код плохо, альтернатива - делать что-то динамическое .
WHILE 1=1
BEGIN
WITH messages AS (
SELECT TOP 1000 id, messageDatetime, message
FROM DemoData
WHERE month(messageDatetime) = 1)
DELETE messages
OUTPUT DELETED.id, DELETED.messageDatetime, DELETED.message
INTO messageArchive_01;
IF (@@ROWCOUNT = 0)
BREAK;
END
WHILE 1=1
BEGIN
WITH messages AS (
SELECT TOP 1000 id, messageDatetime, message
FROM DemoData
WHERE month(messageDatetime) = 2)
DELETE messages
OUTPUT DELETED.id, DELETED.messageDatetime, DELETED.message
INTO messageArchive_02;
IF (@@ROWCOUNT = 0)
BREAK;
END
Код для использования, если вы хотите использовать динамику
declare @sql nvarchar(max)
declare @Template nvarchar(max) ='
WHILE 1=1
BEGIN
WITH messages AS (
SELECT TOP 1000 id, messageDatetime, message
FROM DemoData
WHERE month(messageDatetime) = <MONTH>)
DELETE messages
OUTPUT DELETED.id, DELETED.messageDatetime, DELETED.message
INTO <TABLENAME>;
IF (@@ROWCOUNT = 0)
BREAK;
END'
declare @I int = 1
while @I <= 12
begin
set @sql = replace(@Template, '<TABLENAME>', 'messageArchive_'+right(100+@I, 2))
set @sql = replace(@sql, '<MONTH>', @I)
exec (@sql)
set @I += 1
end