Перемещайте данные SQL Server в ограниченных (1000 строк) порциях в разные таблицы ежемесячно - PullRequest
2 голосов
/ 28 ноября 2011

Я ищу решение, как переместить строки из большой таблицы в порции по 1000 в разные таблицы на основе частей значения даты и времени (в виде ежемесячного архива).Я использую MS SQL Server 2008.

Ремус Русану предоставил следующее решение здесь для stackoverflow Перемещение данных SQL Server в ограниченные (1000 строк) куски для перемещения строк в кусках.Работает как талисман: -)

WHILE 1=1
BEGIN
    WITH messages AS (
    SELECT TOP 1000 id, messageDatetime, message 
        FROM DemoData)
    DELETE messages
        OUTPUT DELETED.id, messageDatetime, message
        INTO messageArchive;

    IF (@@ROWCOUNT = 0)
        BREAK;
END

Теперь мне нужна возможность перемещать строки в разные таблицы в зависимости от месячной части messageDate.

  • сообщения за сентябрь должны быть вставлены в таблицу с именем messageArchive_09
  • сообщения за октябрь должны быть вставлены в таблицу с именем messageArchive_10
  • ...

Есть идеи?

1 Ответ

1 голос
/ 28 ноября 2011

Просто повторите ваш код 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
...