列が非決定的であるため、計算列を永続化できません


9

このタイプの質問が行われたのはこれが初めてではありません。

しかし、次のシナリオで永続的な計算列が「非決定的」に作成されるのはなぜですか。答えはいつも同じでしょ?

CREATE TABLE dbo.test (Id INT, EventTime DATETIME NULL, PosixTime INT NOT NULL)
GO

DECLARE @EventTime DATETIME =  '20181001 12:00:00'
DECLARE @GPSTime INT = DATEDIFF(SECOND, '19700101', @EventTime)
INSERT INTO dbo.Test(Id, EventTime, PosixTime) 
VALUES (1, @EventTime, @GPSTime)
    , (2, NULL, @GPSTime)
GO

SELECT * FROM dbo.test
GO

ALTER TABLE dbo.test ADD UTCTime AS CONVERT(DATETIME2,ISNULL(EventTime, DATEADD(SECOND, PosixTime, CONVERT(DATE,'19700101'))),112) PERSISTED
GO

メッセージ4936、レベル16、状態1、行42テーブル 'test'の計算列 'UTCTime'は、列が非決定的であるため保持できません。

私はここで決定論的ルールに従っていると思います

ここに永続的な計算列を作成することはできますか?

回答:


8

文字列をスタイル番号のない日付に変換することは確定的ではなく、日付または日時をdatetime2に変換するときにスタイル番号を使用する理由もありません。試してください:

ALTER TABLE dbo.test 
    ADD UTCTime AS CONVERT(datetime2,ISNULL(EventTime, 
    DATEADD(SECOND, PosixTime, CONVERT(datetime,'1970-01-01',120)))) 
    PERSISTED;

なぜこのコラムを永続化する必要があるのか​​知りたいです。インデックスを作成できる場合は、インデックスを作成するために列を永続化する必要はありません...


11

文字列表現から変換する場合は、確定的なスタイルを使用する必要があります。

文字列からへの変換で確定的なスタイルを使用していませんでしたdate

日付からに変換するときに、スタイルを不必要に指定していましたdatetime2

質問には、日付と時刻のデータ型が混同されています。

これは機能します(datetime列を生成します):

ALTER TABLE dbo.test 
ADD UTCTime AS 
    ISNULL
    (
        EventTime,
        DATEADD
        (
            SECOND, 
            PosixTime, 
            CONVERT(datetime, '19700101', 112)
        )
    )
    PERSISTED;

Aaronが述べたように(同時に回答しました)、インデックスを付けるために確定的な列を永続化する必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.