在时态表中明确设置ValidFrom

时间:2018-03-10 15:57:34

标签: sql-server temporal

我试图在时态表中设置当前记录的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列。

1 个答案:

答案 0 :(得分:0)

您无法更新时态表上的ValidFrom。但是,您可以在历史记录表上更新ValidFrom来跟踪更改。您可以通过更改时态表中的任何值在此处创建记录。

因此您可以执行以下步骤:

  1. 更改时态表中要更改ValidFrom列的值的行中的任何内容。此步骤将在历史记录表中为原始表中的每个更改的记录创建一条记录。
  2. 关闭临时表的系统版本控制。
  3. 更新历史记录表中的ValidFrom。
  4. 为时态表重新设置系统版本。