私は、ビューの基になるテーブルの列の束のハッシュであるビューのフィールドにインデックスがあるインデックス付きビューを作成しようとしています。
次に例を示します。
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関数から日付フィールドを削除すると、クラスター化インデックスが正常に作成されます。
私の推測では、日付または異なるタイムゾーンをフォーマットするさまざまな方法と関係があると思いますか?...暖かくなっていますか?
CASTは確定的ではありません。サーバーの設定に基づいて日付形式が変わる可能性があるためです(つまり、110以前の互換性の下では、デフォルトの日付形式は0 => "Dec 12 2019 2:11 PM"であり、出力は言語によって異なります)。
確定的にするために、CONVERTと
スタイルパラメータは定数でなければなりません。また、スタイル20および21を除いて、100以下のスタイルは非決定的です。スタイル106、107、109および113を除き、100より大きいスタイルは決定的です。
詳細なドキュメント: 確定的および非確定的関数