2017-10-13 87 views
1

我有更新行的时间历史记录表中的MS SQL Server 2016更新时间表历史

从文档的问题,应所需的步骤如下:

  1. 禁用系统版本
  2. 修改历史表
  3. 使系统重新版本

我试图创建一个做到这一点的方法,但得到这个错误:

Msg 13561, Level 16, State 1, Line 23 Cannot update rows in a temporal history table 'db.dbo.FooHistory'.

这里是我的SQL:

CREATE TABLE Foo(
    id int primary key not null 
    , title nvarchar(50) not null 
    , startTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL 
    , endTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL 
    , PERIOD FOR SYSTEM_TIME (startTime, endTime)) 

ALTER TABLE Foo 
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.FooHistory)); 

GO 

CREATE PROCEDURE [dbo].[UpdateFooHistory] AS 
    BEGIN 
    SET NOCOUNT ON 

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 
    BEGIN TRANSACTION; 
    ALTER TABLE dbo.Foo SET (SYSTEM_VERSIONING = OFF);  

    UPDATE dbo.FooHistory 
    SET title = 'Foo'; 

    ALTER TABLE dbo.Foo SET (SYSTEM_VERSIONING = ON (
     HISTORY_TABLE = dbo.FooHistory, 
     DATA_CONSISTENCY_CHECK = ON 
    )); 

    COMMIT TRANSACTION 

    RETURN 0 
    END 
GO 

好像SQL Server正在检查如果表是在时间上“编译时“而不是在运行时。这是真的?有没有办法解决它?

+1

你将不得不使用动态SQL进行更新。 –

回答

0

更改UPDATE语句此,它可以让你创建的过程:

EXEC(N'UPDATE dbo.FooHistory SET title = ''Foo''');