我正在进行滑动窗口分区以存档旧数据,但是当我尝试存档第二天数据时,我只能存档第一个日期数据,这会导致以下错误。
消息4905,级别16,状态1,行1 ALTER TABLE SWITCH语句 失败。目标表' bank.dbo.tblFactsStaging'必须是空的。
我以前用于将分区移动到归档表的查询是
ALTER TABLE dbo.tblFacts
SWITCH PARTITION 1 TO dbo.tblFactsStaging
;
答案 0 :(得分:2)
如果您尝试将数据切换到已分区的表,则需要指定目标分区。类似的东西:
ALTER TABLE dbo.tblFacts SWITCH PARTITION 1 TO dbo.tblFactsStaging partition 5;
以上假设源和目标在很多方面匹配(文件组,索引等)。虽然我过去做过这种事情,但我已将数据切换到非分区表中,确保索引适合最终目标,它位于正确的文件组中,等等。然后我会将其切换到存档中。我发现这样做的方式更加灵活,因为您的实时数据和存档不需要具有相同的索引或数据位置。
查看this article了解详情。
编辑:这是在表之间切换分区的简单示例。请注意,两个表使用相同的分区方案(并且,通过扩展,分区函数),这使得事情变得简单,因为源和目标分区应该始终相同,并且您只需要对分区函数进行任何维护(即拆分和合并范围)一次。另外,请注意在实际受影响的时间段内完成任何分区功能维护以最大限度地减少数据移动。在我的示例中,我想在将任何数据添加到它之后很久就存档2015-01-01分区,并且希望在添加任何数据之前创建2016-01-01分区。< / p>
use tempdb;
create partition function [PF_PartitionTest] (date)
as range right
for values (
'2015-01-01',
'2015-02-01',
'2015-03-01',
'2015-04-01',
'2015-05-01',
'2015-06-01',
'2015-07-01',
'2015-08-01',
'2015-09-01',
'2015-10-01',
'2015-11-01',
'2015-12-01'
);
create partition scheme [PS_PartitionTest]
as partition [PF_PartitionTest]
all to ([primary]);
create table dbo.PartitionTest (
[ID] int identity not null,
[PeriodDate] date not null,
constraint [PK_PartitionTest] primary key clustered ([ID], [PeriodDate]),
[Fluff] varchar(500) null
) on [PS_PartitionTest] ([PeriodDate]);
insert into dbo.PartitionTest ([PeriodDate])
select dateadd(day, Number, '2014-12-31')
from dbadmin.dbo.Numbers
where Number <= 365;
select *, $Partition.[PF_PartitionTest]([PeriodDate])
from dbo.PartitionTest;
create table dbo.PartitionTest_Archive (
[ID] int identity not null,
[PeriodDate] date not null,
constraint [PK_PartitionTest_Archive] primary key clustered ([ID], [PeriodDate]),
[Fluff] varchar(500) null
) on [PS_PartitionTest] ([PeriodDate]);
ALTER TABLE dbo.PartitionTest
SWITCH PARTITION 2
TO dbo.PartitionTest_Archive partition 2;
alter partition function [PF_PartitionTest]()
merge range ('2015-01-01');
alter partition function [PF_PartitionTest]()
split range ('2016-01-01');
select min([PeriodDate]), max([PeriodDate])
from dbo.PartitionTest;
select min([PeriodDate]), max([PeriodDate])
from dbo.PartitionTest_Archive;