2011-11-28 52 views
2

我正在寻找一个解决方案如何,我可以在不同的表1000块基于日期时间的部分,从一个大表移动行价值(作为每月档案)。我使用MS SQL Server 2008的移动SQL Server数据

莱姆斯Rusanu在块移动行此处提供的计算器Move SQL Server data in limited (1000 row) chunks以下解决方案。像魅力一样工作:-)

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

只是重复你有12倍的代码使用month()不同的目标表中的WHERE子句和。我知道,复制和粘贴代码感觉不好,替代方法是做一些事情dynamic。硬编码是要走的路 -

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([email protected], 2)) 
    set @sql = replace(@sql, '<MONTH>', @I) 

    exec (@sql) 

    set @I += 1 
end 
+0

+1使用。即使在动态SQL中,他也需要对翻译值进行硬编码,或者对每一行进行日期时间比较。 – JNK

相关问题