Sql server 如何更改SQL Server中系统版本表(时态表)的datetime2的精度?

Sql server 如何更改SQL Server中系统版本表(时态表)的datetime2的精度?,sql-server,temporal-tables,alter-column,Sql Server,Temporal Tables,Alter Column,我有62个表被设置为系统版本/时态表,除了开始和结束时间列被设置为datetime2(0),如下所示 SysStartTime [datetime2](0) GENERATED ALWAYS AS ROW START NOT NULL, SysEndTime [datetime2](0) GENERATED ALWAYS AS ROW END NOT NULL, 因此,历史记录表中的记录似乎是重复的,因为当系统多次修改记录时,我们会失去必要的精度。我找不到任何关于修改这两列的文档,但尝试了以下

我有62个表被设置为系统版本/时态表,除了开始和结束时间列被设置为
datetime2(0)
,如下所示

SysStartTime [datetime2](0) GENERATED ALWAYS AS ROW START NOT NULL,
SysEndTime [datetime2](0) GENERATED ALWAYS AS ROW END NOT NULL,
因此,历史记录表中的记录似乎是重复的,因为当系统多次修改记录时,我们会失去必要的精度。我找不到任何关于修改这两列的文档,但尝试了以下代码:

ALTER TABLE SystemVersionedTable 
    SET (SYSTEM_VERSIONING = OFF);

ALTER TABLE SystemVersionedTable 
    ALTER COLUMN SysStartTime DATETIME2(7);

ALTER TABLE SystemVersionedTable 
    ALTER COLUMN SysEndTime DATETIME2(7);

ALTER TABLE SystemVersionedTable 
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.dbo_SystemVersionedTable));
但是,我仍然得到以下错误:

无法更改系统版本化时态表中的周期列“SysStartTime”


是否有办法更改这两列并将其设置为
datetime2(7)

下面的脚本对我来说很有效(当然,您需要用您的值替换{tableSchema}、{tableName}、{historyTableSchema}、{historyTableName})

脚本将SysStartTime和SysEndTime的新精度设置为7

请注意,SysEndTime列如何需要具有给定精度的最大DATETIME2值(因此更新)

还要注意如何删除和重新创建索引ix{historyTableName},它是在定义时态表时默认创建的

请参阅以供参考:


您需要创建一个新表
BEGIN TRANSACTION

    ALTER TABLE [{tableSchema}].[{tableName}] SET (SYSTEM_VERSIONING = OFF)
    ALTER TABLE [{tableSchema}].[{tableName}] DROP PERIOD FOR SYSTEM_TIME
    DROP INDEX [ix_{historyTableName}] ON [{historyTableSchema}].[{historyTableName}]
    GO

    ALTER TABLE [{tableSchema}].[{tableName}]               ALTER COLUMN SysStartTime DATETIME2(7) NOT NULL
    ALTER TABLE [{tableSchema}].[{tableName}]               ALTER COLUMN SysEndTime   DATETIME2(7) NOT NULL
    ALTER TABLE [{historyTableSchema}].[{historyTableName}] ALTER COLUMN SysStartTime DATETIME2(7) NOT NULL
    ALTER TABLE [{historyTableSchema}].[{historyTableName}] ALTER COLUMN SysEndTime   DATETIME2(7) NOT NULL
    CREATE CLUSTERED INDEX [ix_{historyTableName}] ON [{historyTableSchema}].[{historyTableName}] (SysEndTime, SysStartTime)
    GO

    UPDATE [{tableSchema}].[{tableName}] SET SysEndTime = CONVERT(DATETIME2(7), '9999-12-31 23:59:59.9999999')
    GO

    ALTER TABLE [{tableSchema}].[{tableName}] ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
    ALTER TABLE [{tableSchema}].[{tableName}] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [{historyTableSchema}].[{historyTableName}], DATA_CONSISTENCY_CHECK = ON))
    GO

COMMIT TRANSACTION