微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更改SQL Server中系统版本表时间表的datetime2的精度?

如何解决如何更改SQL Server中系统版本表时间表的datetime2的精度?

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

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 值(因此是 UPDATE)。

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

参见参考:https://docs.microsoft.com/en-us/sql/relational-databases/tables/creating-a-system-versioned-temporal-table?view=sql-server-ver15#migrate-existing-tables-to-built-in-support

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。