我在 Azure SQL 数据库中创建了一个系统版本化(临时)表,遵循此文档Creating a temporal table:
CREATE TABLE Department
(
DeptID int NOT NULL PRIMARY KEY CLUSTERED
, DeptName varchar(50) NOT NULL
, ManagerID INT NULL
, ParentDeptID int NULL
, SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL
, SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL
, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
)
WITH
(
SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory)
)
;
我在不同的 Azure SQL Server 中创建了两个临时表 Department 和 Department2。
我在数据工厂副本活动中测试,选择部门作为源数据集,我们可以从设置中看到时态表:
选择Department2作为链接数据集,表映射::
列映射:
主动运行成功:
这意味着 Azure 数据工厂支持将数据从一个时态表复制到另一个数据库的另一个时态表。
更新:
请参考此文档:Temporal Tables in SQL Server 2016 – Part III。
现在,从 INSERT 开始,请记住在声明为 GENERATED ALWAYS AS ROW START / END 的临时表中有两个 datetime2 特殊列。
这些是 PERIOD 列,它们是强制性的,但您不能将显式值插入 GENERATED ALWAYS 列。它的值将被自动填充。
当您在表中插入新行时,“ROW START”列将具有 SYSUTCDATETIME() 值(是的,不要忘记它是 UTC 时间!)并且“ROW END”列将具有值:'9999 -12-31 23:59:59.9999999'
基本上,在临时表中插入新行时,对于这两列,您可以使用以下选项:
1.使用列列表,省略这两列;
2. 使用列列表而不省略这两列,并在每个列的值列表中指定 DEFAULT。
3. 不要使用列列表并在每个列的值列表中指定 DEFAULT。
恭喜,错误已自行解决:
- 在关闭目标表的版本控制后加载表,它可以工作。
ALTER TABLE [dbo].[Department] SET(SYSTEM_VERSIONING = OFF); ALTER TABLE [dbo].[Department] DROP PERIOD FOR SYSTEM_TIME;
- 然后在复制活动完成后,将其切换回来。
ALTER TABLE [dbo].[Department] ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime); ALTER TABLE [dbo].[Department] SET(SYSTEM_VERSIONING = ON);
希望这会有所帮助。