【问题标题】:Temporal table default constraint for ValidFrom does not workValidFrom 的临时表默认约束不起作用
【发布时间】:2017-08-09 11:41:36
【问题描述】:

我有这个特定的问题。我正在运行 Microsoft SQL Server Management Studio (13.0.16000.28),我想创建临时表 Price。我想将“ValidFrom”列设置为默认值,例如“1900-01-01 00:00:00”。我正在运行的代码是

CREATE TABLE [DWH_STORE].[dbo].[Price] (
  ID int,
  ProdName nvarchar(40),
  Price int,
  ValidFrom datetime2(0) GENERATED ALWAYS AS ROW START CONSTRAINT DF_ValidFrom DEFAULT '1900-01-01 00:00:00' NOT NULL,
  ValidTo datetime2(0) GENERATED ALWAYS AS ROW END NOT NULL,
          PERIOD FOR SYSTEM_TIME ( ValidFrom, ValidTo),
  CONSTRAINT PK_ID_ProdName PRIMARY KEY (ID, ProdName)
) WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[PriceHistory]));

但是,当我在表中插入数据时

INSERT INTO [DWH_STORE].[dbo].[Price] (ID, ProdName, Price)
    VALUES (12, 'Banana', 1)`

SELECT * FROM [DWH_STORE].[dbo].[Price]

我明白了

列“ValidFrom”为“2017-08-09 11:18:30”。为什么我没有按预期获得该列的默认值“1900-01-01 00:00:00”?

插入时我的 Sysdatetime() 是 '2017-08-09 13:18:30'

我尝试将 DEFAULT 设置为 Sysdatetime() 以获取当前日期和时间,但这也不起作用。似乎如果我将 DEFAULT 设置为任何我总是得到相同的结果。

感谢每一个回答。

【问题讨论】:

    标签: sql date constraints sql-server-2016 temporal-tables


    【解决方案1】:

    我将“ValidFrom”列为“2017-08-09 11:18:30”。为什么我没有按预期获得该列的默认值“1900-01-01 00:00:00”?

    它按预期工作。你的假设是错误的。来自Temporal Tables

    插入:

    在 INSERT 中,系统根据系统时钟将 SysStartTime 列的值设置为当前事务的开始时间(在 UTC 时区),并将 SysEndTime 列的值分配为最大值值为 9999-12-31。这会将行标记为打开。

    【讨论】:

    • 好的,谢谢。问题是如何实现 SysStartTime 列的值将具有默认值,例如 'dateadd(dd,(-1),SYSDATETIME ( ))' - 昨天??
    • @PeterNagy - 如果您想控制日期时间值,那么您不需要 system-versioned 临时表,这是此功能的更完整名称。跨度>
    • 谢谢@Damien_The_Unbeliever。如果我做对了,这只是因为 system-versioned 时态表的限制(无论如何,我不明白为什么如果不能使用日期时间值可以设置默认值) .我应该使用什么来控制日期时间值而不是 system-versioned 时态表?在 INSERT 中为 ValidFrom 使用 DEFAULT 关键字怎么样?
    • 如果表中已有数据,在 ALTER TABLE 情况下,列的默认值可能更有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2010-12-19
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多