2017-08-09 84 views
2

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

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] 

我得到

result

与列 'ValidFrom' 为“2017-08- 09 11:18:30'。为什么我没有像预期那样得到该列的默认值'1900-01-01 00:00:00'?

我SYSDATETIME()在插入的时间为“2017年8月9日13时18分三十〇秒”

我试图设置默认为SYSDATETIME()来获得当前日期和时间,而且不不工作。看来,如果我设置DEFAULT为任何我总是得到相同的结果。

我很感谢每一个答案。

回答

2

我把'ValidFrom'这列'2017-08-09 11:18:30'。为什么我没有像预期那样得到该列的默认值'1900-01-01 00:00:00'?

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

内页:

上的INSERT,系统设置为SysStartTime列到当前事务的开始时间基于系统时钟值(UTC时区)和将SysEndTime列的值分配给最大值9999-12-31。这标志着这一行是开放的。

+0

好的,谢谢。问题是如何实现SysStartTime列的值将具有DEFAULT值,例如'dateadd(dd,( - 1),SYSDATETIME())' - 昨天? – Peter

+0

@PeterNagy - 如果你想控制日期时间值,那么你不希望* system-versioned *时间表,这是一个更完整的名称为这个功能。 –

+0

谢谢@Damien_The_Unbeliever。如果我明白了这一点,这仅仅是因为_system-versioned_时间表的限制(无论如何,我不明白为什么可以为日期时间值设置默认值,如果它们不能使用)。 我应该用什么来控制日期时间值而不是_system-versioned_临时表?在INSERT for ValidFrom中使用DEFAULT关键字怎么样? – Peter