2016-11-09 7 views
7

私はMicrosoft Temporalテーブルに変換するデータを持つ多くのテーブルを持っていますが、私は一時テーブルを変換したいときに私のデータを失った。 私のコードは次のとおりです。データを保持して存在テーブルをSQL一時テーブルに変更する方法はありますか?

Alter TABLE dbo.Employee 
( 
    [EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED 
    , [Name] nvarchar(100) NOT NULL 
    , [Position] varchar(100) NOT NULL 
    , [Department] varchar(100) NOT NULL 
    , [Address] nvarchar(1024) NOT NULL 
    , [AnnualSalary] decimal (10,2) NOT NULL 
    , [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START 
    , [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END 
    , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo) 
)  
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory)); 

どのようにデータを保持して、SQL一時テーブルに存在テーブルを変更することができますか?

答えて

2

まず、システム時間帯に2つの列を任意の表に追加する必要があります。アップコードで

CREATE TABLE DepartmentHistory 
( 
    DeptID int NOT NULL 
    , DeptName varchar(50) NOT NULL 
    , SysStartTime datetime2 NOT NULL 
    , SysEndTime datetime2 NOT NULL 
); 
GO 
CREATE CLUSTERED COLUMNSTORE INDEX IX_DepartmentHistory 
    ON DepartmentHistory; 
CREATE NONCLUSTERED INDEX IX_DepartmentHistory_ID_PERIOD_COLUMNS 
    ON DepartmentHistory (SysEndTime, SysStartTime, DeptID); 
GO 
CREATE TABLE Department 
( 
    DeptID int NOT NULL PRIMARY KEY CLUSTERED 
    , DeptName varchar(50) NOT NULL 
    , SysStartTime datetime2 NOT NULL 
    , SysEndTime datetime2 NOT NULL   
) ; 

SysStartTimeSysEndTimeシステム周期時間の列があります。このような 。

その後、あなたは簡単に時間的なテーブルに変換することができます:あなたは一時的なテーブルがあり、テーブルスキーマを編集したいので、あなたは、このコードでそれを行うことができれば、

ALTER TABLE dbo.Department 
    ADD PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime]) 
ALTER TABLE dbo.Department  
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory, DATA_CONSISTENCY_CHECK = ON)); 

をそして:

ALTER TABLE Test.dbo.Department 
    SET (SYSTEM_VERSIONING = OFF) 
5
  1. 一時テーブルを作成します。

  2. 元のテーブルのデータを一時テーブルに挿入します。

  3. 元のテーブルを削除します。 2つの段階でのEmployeeテーブル内のシステムのバージョン管理ON

+1

私は多くのテーブルが100テーブルになる可能性があります。この方法は毎回すべてのテーブルで使用できないと思います。ご回答有難うございます。 –

1

電源を入れ

  1. 実行した後、新たな時代の列(HIDDEN)
  2. 作成し、デフォルトの履歴テーブル

    ALTER TABLE Employee 
    ADD 
    ValidFrom datetime2 (2) GENERATED ALWAYS AS ROW START HIDDEN  
        constraint DF_ValidFrom DEFAULT DATEADD(second, -1, SYSUTCDATETIME()) 
    , ValidTo datetime2 (2) GENERATED ALWAYS AS ROW END HIDDEN  
        constraint DF_ValidTo DEFAULT '9999.12.31 23:59:59.99' 
    , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo); 
    
    ALTER TABLE Employee  
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Employee_History)); 
    

を追加上記のスクリプトでは、すべてのデータの変更が透過的に収集されますyを履歴テーブルに追加します。 一般的なデータ監査シナリオでは、一定期間内に個々の行に適用されたすべてのデータ変更を照会します。デフォルトの履歴テーブルは、このユースケースに効率的に対処するために、クラスタ化された行ストアBツリーを使用して作成されます。

関連する問題