2017-08-09 85 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