2

日時値の一部に基づいて (毎月のアーカイブとして) 1000 のチャンクの大きなテーブルから別のテーブルに行を移動する方法を探しています。MS SQL Server 2008 を使用しています。

Remus Rusanu は、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 の月の部分に応じて行を別のテーブルに移動する機能です。

  • 9 月からのメッセージは、messageArchive_09 という名前のテーブルに挿入する必要があります。
  • 10 月からのメッセージは、messageArchive_10 という名前のテーブルに挿入する必要があります
  • ...

何か案は?

4

1 に答える 1

1

month()と別のターゲットテーブルを使用してwhere句を使用して12回コードを繰り返します。私は知っています、コードをコピーして貼り付けるのは気分が悪いです、代わりに何か動的なことをすることです。

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
于 2011-11-28T13:54:57.230 に答える