我创建了两个表,一个是OrdersLatest,另一个是OrdersMarch。我想将数据从分区表切换到同一文件组上的临时表(OrdersMarch),反之亦然。
切换时效果很好,但切换时出现问题。我的情况切换时不起作用
它显示以下错误,表明源表和目标表(OrdersMarch)之间的约束不匹配。我不确定应该更改什么来解决此错误。
我已经检查了左右分区,但问题是相同的。我也在分区列上的临时表 ( OrdersMarch )上设置了约束,但错误是相同的。谁能解决这个问题,具体问题出在哪里?
ALTER TABLE SWITCH 语句失败。源表“TEST.dbo.OrdersMarch”的检查约束或分区函数允许使用目标表“TEST.dbo.OrdersLatest”上的检查约束或分区函数不允许的值。
配分函数
CREATE PARTITION FUNCTION OrdersLatestPartitionFunction (datetime)
AS RANGE RIGHT FOR VALUES (
'20180101',
'20190101',
'20200101'
);
GO
分区方案
CREATE PARTITION SCHEME OrdersLatestPartitionScheme
AS PARTITION OrdersLatestPartitionFunction
TO (
OrdersLatestFg1,
OrdersLatestFg2,
OrdersLatestFg3,
OrdersLatestFg4
);
GO
创建表
CREATE TABLE OrdersLatest (
OrderDate date NOT NULL,
OrderId int IDENTITY NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT PKOrdersLatest PRIMARY KEY CLUSTERED(OrderDate, OrderId)
)
ON OrdersLatestPartitionScheme(OrderDate);
GO
切换目标表
CREATE TABLE OrdersMarch (
OrderDate date NOT NULL,
OrderId int IDENTITY NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT PKOrdersMarch PRIMARY KEY CLUSTERED(OrderDate, OrderId)
)
ON OrdersLatestFg3;
GO
数据插入
INSERT INTO OrdersLatest(OrderDate, OrderDesc) VALUES
('20190302', 'Cat food'),
('20190315', 'Water bowl'),
('20190318', 'Saddle for camel'),
('20190321', 'Dog biscuits'),
('20190328', 'Bigfoot shoes');
GO
插入后输出
+-------------+-----------------+--------+
| Partition | Filegroup | Rows |
|-------------+-----------------+--------|
| 1 | OrdersLatestFg1 | 0 |
| 2 | OrdersLatestFg2 | 0 |
| 3 | OrdersLatestFg3 | 5 |
| 4 | OrdersLatestFg4 | 0 |
+-------------+-----------------+--------+
关掉
ALTER TABLE OrdersLatest SWITCH PARTITION 3 TO OrdersMarch;
切换后输出
+-------------+-----------------+--------+
| Partition | Filegroup | Rows |
|-------------+-----------------+--------|
| 1 | OrdersLatestFg1 | 0 |
| 2 | OrdersLatestFg2 | 0 |
| 3 | OrdersLatestFg3 | 0 |
| 4 | OrdersLatestFg4 | 0 |
+-------------+-----------------+--------+
切换入
ALTER TABLE OrdersMarch SWITCH TO OrdersLatest PARTITION 3;
ALTER TABLE SWITCH 语句失败。源表“TEST.dbo.OrdersMarch”的检查约束或分区函数允许使用目标表“TEST.dbo.OrdersLatest”上的检查约束或分区函数不允许的值。
SQL Server 要求源数据位于目标分区的边界内,以便将
SWITCH
数据写入分区表。正如错误消息所示,可以使用其中一种方法提前保证这一点。方法一:
在非分区源表上创建检查约束以匹配目标分区边界(或其子集)。您的场景的分区 3 的检查约束
RANGE RIGHT
是:此检查约束将允许您将
OrdersMarch
表切换到OrdersLatest
分区 3。请注意,仅当临时表切换到主表分区时,才必须对临时表进行检查约束;当您将分区切换到临时表时,这不是必需的,但如果存在,则检查约束表达式必须与源分区边界相同(或其超集)。如果您对不同分区使用相同的临时表,请注意这一点。每个分区需要不同的检查约束表达式。我发现方法 2 更容易,因为它避免了在临时表上(重新)创建检查约束的需要。
方法二:
使用相同(或相似)的分区函数/方案对暂存表进行分区,以便源表分区边界与目标分区相同(或子集)。这还保证了源分区和目标分区存储对齐,这是
SWITCH
.然后也可以通过指定源分区号将数据切换到目标分区:
请注意,我在本示例中将 OrderDate 列数据类型从 更改为
date
,datetime
以匹配您的分区函数。分区列数据类型必须与分区函数的数据类型匹配,因此您的问题 DDL 中似乎存在拼写错误。