web-dev-qa-db-ja.com

DATEフィールドをVARCHARデータ型に非決定論的にキャストするのはなぜですか?それを決定論的にする方法はありますか?

私は、ビューの基になるテーブルの列の束のハッシュであるビューのフィールドにインデックスがあるインデックス付きビューを作成しようとしています。

次に例を示します。

CREATE VIEW CoolHashedView WITH SCHEMABINDING AS

    SELECT 
        KeyId,
        CONVERT
        (
            VARCHAR(34), 
            HASHBYTES('MD5', TextColumn1 + '||' + TextColumn2 + '||' + CAST(DateColumn1 AS VARCHAR(50)), 
            2
        ) AS HashedData
    FROM dbo.BoringTable;

    CREATE UNIQUE CLUSTERED INDEX IX_CoolHashedView_KeyId_HashedData ON CoolHashedView (KeyId, HashedData);

上記のインデックスを作成しようとすると失敗し、次のエラーがスローされます。

メッセージ2729、レベル16、状態1、行26ビュー 'CoolHashedView'の列 'HashedData'は、非決定的であるため、インデックスまたは統計で、またはパーティションキーとして使用できません。

HASHBYTEs関数から日付フィールドを削除すると、クラスター化インデックスが正常に作成されます。

私の推測では、日付または異なるタイムゾーンをフォーマットするさまざまな方法と関係があると思いますか?...暖かくなっていますか?

12
J.D.

CASTは確定的ではありません。サーバーの設定に基づいて日付形式が変わる可能性があるためです(つまり、110以前の互換性の下では、デフォルトの日付形式は0 => "Dec 12 2019 2:11 PM"であり、出力は言語によって異なります)。
確定的にするために、CONVERTと

スタイルパラメータは定数でなければなりません。また、スタイル20および21を除いて、100以下のスタイルは非決定的です。スタイル106、107、109および113を除き、100より大きいスタイルは決定的です。

詳細なドキュメント: 確定的および非確定的関数

27
Piotr