2017-08-09 14 views
2

この特定の問題があります。私はMicrosoft SQL Server Management Studio(13.0.16000.28)を実行しており、一時テーブルPriceを作成したいと考えています。私は 'ValidFrom'列をデフォルトの値、例えば '1900-01-01 00:00:00'に設定したいと思います。私は私のテーブルにデータを挿入するとき、私は実行しているコードは、私が2017-08-を「とコラムで 'ValidFrom' をValidFromのテンポラルテーブルの既定の制約が機能しません。

result

を取得

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

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

、しかし

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])); 

です09 11:18:30 '。なぜ私は期待どおりにその列のデフォルト値 '1900-01-01 00:00:00'を取得しないのですか?挿入時の

マイSysdatetime()「2017年8月9日午後01時18分30秒」だった

私は、現在の日付と時刻を取得するために)Sysdatetime(としてDEFAULTを設定しようとしましたが、それはありませんどちらもうまくいかない。 DEFAULTを何にしても、私はいつも同じ結果を得ているようです。

私はすべての答えを感謝しています。

答えて

2

私はカラム 'ValidFrom'を '2017-08-09 11:18:30'として取得しました。なぜ私は期待どおりにその列のデフォルト値 '1900-01-01 00:00:00'を取得しないのですか?

期待どおりに動作しています。あなたの前提は間違っています。

挿入します:Temporal TablesからINSERTに

、システムは、システムクロックに基づいて、(UTCタイムゾーンで)現在のトランザクションの開始時にSysStartTime列の値を設定し、 SysEndTime列の値を9999-12-31の最大値に割り当てます。行が開いているとマークします。

+0

よろしくお願いいたします。質問は、どのように私はSysStartTime列の値を達成することができますDEFAULTの値は、 'dateadd(DD、( - 1)、SYSDATETIME())' - 昨日? – Peter

+0

@PeterNagy - 日時の値を制御する場合、この機能の完全な名前である* system-versioned * temporalテーブルは不要です。 –

+0

ありがとう@Damien_The_Unbeliever。私がこの権利を得た場合、これは_system-versioned_ temporalテーブルの制限のためです(それが使用できない場合、datetime値のデフォルト値を設定することがなぜ可能なのか分かりません)。 _system-versioned_一時テーブルの代わりにdatetime値を制御するために使用するものは何ですか? ValidFromのINSERTでDEFAULTキーワードを使用するとどうなりますか? – Peter

関連する問題