2016-08-02 12 views
1

私はwhere句で現在使用しているパフォーマンスの向上を得るために、複数の列にhashbytesを使用してハッシュキーを作成しています。datetime2フィールドを持つHas​​hBytes

alter table dbo.Table1 
add HashKey AS CAST(hashbytes('MD5', PID+PNumber+CONVERT([varchar] (50),[DateStamp]) +CONVERT(VARCHAR(50), TransactionCount)+OCD+ONbr+TransactionID) AS VARBINARY(80)) PERSISTED 

ただし、その中の列の1つは、追加できないdatetime2フィールドです。私はエラーメッセージの下で取得しようとしていましたが、

"テーブル 'table1'の計算された 'HashKey'は、列が非決定論的なので永続化できません。

私の研究から、datetime2は非決定論的なので使用できないことがわかりました。

しかし、値をすべてミリ秒単位で正確に比較する必要があるため、フォーマットを変更することはできません。

誰でも私に回避策を教えていただけますか?他の解決策がありますか?

+0

私は決して非決定的なデータ型について聞いたことがありません。あなたがやっていることは、チェックサム関数とほとんど同じですね。https://msdn.microsoft.com/en-us/library/ms189788.aspx –

+0

式リストの値の1つが変更された場合、リストのチェックサムも一般に変更されます。ただし、チェックサムが変更されない可能性はわずかです。このため、CHECKSUMを使用して値が変更されたかどうかを検出することはお勧めしません。我々はこれを容認しない:) –

答えて

0

私は意味合いのかわからない...

しかし、バイナリに日時をキャストすることは常に例については、以下の新しいvalue.seeを与える..

select getdate(),cast(getdate()as binary) 

2016-08-02 10:17:20.573 0x000000000000000000000000000000000000000000000000A65600A98EEC 


2016-08-02 10:17:40.537 0x000000000000000000000000000000000000000000000000A65600A9A651 

がそうのようにしてみてください。..

select hashbytes('md5',cast(getdate()as binary)) 
+0

私はur suggesionから続く通りにした。 (VARCHAR(50)、TransactionCount)+ OCD + ONbr(VARCHAR(50)、VARCHAR(50)、VARCHAR + TransactionID)AS VARBINARY(80))PERSISTED'それは今働いています。 Thx –

+0

実際に私は問題を直面しているので、ハッシュバイトの値を生成した値に相当するc#を取得してください。 datestampをバイナリに変換してからvarcharに変換したので、今私は同じのC#同等の値を取得することができません。私は別の質問として投稿していただきありがとうございます。http://stackoverflow.com/questions/38739141/convert-sql-hash-bytes-binary-value-multiple-datatype-fields-combination-to-c –

+1

理由は 'BINARY'へのキャストは機能しましたが、' VARCHAR'はそうではありませんでした。これは、datetimeから文字列への 'CAST'が_locale_固有であるためです。したがって、非決定論的な警告。いつでもWindowsまたはSQL Serverのロケールを変更できます。標準化されたISO-8601フォーマット文字列を取得するために 'CONVERT(VARCHAR(100)、datestamp、126)'を使用し、C#アプリケーションで同じことを行い、ハッシュ値が一致するはずです。同じエンコーディング)。 – rmalayter

関連する問題