Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 每月将有限(1000行)的SQL Server数据块移动到不同的表中_Sql Server 2008_Move_Sql Delete_Datepart - Fatal编程技术网

Sql server 2008 每月将有限(1000行)的SQL Server数据块移动到不同的表中

Sql server 2008 每月将有限(1000行)的SQL Server数据块移动到不同的表中,sql-server-2008,move,sql-delete,datepart,Sql Server 2008,Move,Sql Delete,Datepart,我正在寻找一个解决方案,如何根据datetime值的一部分,将1000个大表中的行移动到不同的表中,作为每月存档。我正在使用MS SQL Server 2008 Remus Rusanu在stackoverflow上提供了以下解决方案,用于在块中移动行。工作起来很有魅力:- WHILE 1=1 BEGIN WITH messages AS ( SELECT TOP 1000 id, messageDatetime, message FROM DemoData)

我正在寻找一个解决方案,如何根据datetime值的一部分,将1000个大表中的行移动到不同的表中,作为每月存档。我正在使用MS SQL Server 2008

Remus Rusanu在stackoverflow上提供了以下解决方案,用于在块中移动行。工作起来很有魅力:-

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的表中 ...
有什么想法吗?

只需使用where子句和不同的目标表,重复您的代码12次即可。我知道,复制和粘贴代码感觉很糟糕,另一种选择是做点什么

如果您想使用dynamics,请使用一些代码

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

+1-硬编码是一条路要走。即使在动态SQL中,他也需要硬编码转换值,或者对每一行进行日期时间比较。
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