Sql server 2008 每月将有限(1000行)的SQL Server数据块移动到不同的表中
我正在寻找一个解决方案,如何根据datetime值的一部分,将1000个大表中的行移动到不同的表中,作为每月存档。我正在使用MS SQL Server 2008 Remus Rusanu在stackoverflow上提供了以下解决方案,用于在块中移动行。工作起来很有魅力:-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)
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