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 回答