Ежемесячно перемещайте данные SQL Server ограниченными фрагментами (1000 строк) в разные таблицы.

Я ищу решение, как я могу перемещать строки из большой таблицы кусками по 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
  • ...

Любые идеи?


person Sascha    schedule 28.11.2011    source источник


Ответы (1)


Просто повторите код, который у вас есть, 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
person Mikael Eriksson    schedule 28.11.2011
comment
+1 - Жесткое кодирование - это путь. Даже в динамическом SQL ему пришлось бы жестко закодировать значения перевода или выполнить сравнение даты и времени для каждой строки. - person JNK; 28.11.2011