我试图在时态表中设置当前记录的ValidFrom范围。我这样做是因为我正在将历史记录从另一个系统(非SQL)重建到一个数据仓库中,因此当前版本的记录可能是"从"过去的日期。如果我不能让这个工作,我的后退是在历史表中添加一行填补空白,但我认为有一种方法可以使这个工作。也许有一些改变列的方法?
/******** CURRENT TIME=2018-03-10 15:32:26 *****/
CREATE TABLE TestHist(
ID int NOT NULL,
Name varchar(max),
--Temporal Stuff
ValidFrom datetime2(7) NOT NULL,
ValidTo datetime2(7) NOT NULL
)
GO
CREATE TABLE Test(
ID int IDENTITY(1,1) NOT NULL,
Name varchar(max),
--Temporal Stuff
ValidFrom datetime2(7) GENERATED ALWAYS AS ROW START NOT NULL,
ValidTo datetime2(7) GENERATED ALWAYS AS ROW END NOT NULL,
PRIMARY KEY CLUSTERED (ID ASC) ,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH( SYSTEM_VERSIONING = ON ( HISTORY_TABLE = dbo.TestHist ) )
GO
ALTER TABLE Test SET (SYSTEM_VERSIONING = OFF)
go
--THIS WORKS BUT SETS THE VALIDFROM TO CURRENT TIME
insert into Test(name) values ('fred')
--AND BTW, THIS IS HOW I LOAD THE HISTORY (THIS WORKS TOO)
insert into TestHist(ID,Name,ValidFrom,ValidTo) values (1,'joe',null,'1/1/18','1/15/18')
insert into TestHist(ID,Name,ValidFrom,ValidTo) values (1,'steve','fred','2/1/18','3/1/18')
但问题是它将当前的ValidFrom时间任意设置为你执行insert语句的时间:
select * from test
ID Name ParentName ValidFrom ValidTo
1 fred NULL 2018-03-10 15:32:26.4403041 9999-12-31 23:59:59.9999999
这就是我希望我能做到的事情:
--THIS DOESN'T WORK
insert into Test(name,ValidFrom,ValidTo) values ('fred','2/1/18','9999-12-31 23:59:59.997')
我收到此错误:
Msg 13536,Level 16,State 1,Line 38
无法在表' CodeAnalytics.dbo.Test'中的GENERATED ALWAYS列中插入显式值。将INSERT与列列表一起使用以排除GENERATED ALWAYS列,或将DEFAULT插入GENERATED ALWAYS列。
答案 0 :(得分:0)
您无法更新时态表上的ValidFrom。但是,您可以在历史记录表上更新ValidFrom来跟踪更改。您可以通过更改时态表中的任何值在此处创建记录。
因此您可以执行以下步骤: