2016-08-04 60 views
1

我想湊使用HashBytesHASHBYTES計算列不能持久,因爲該列是不確定性

alter table dbo.Events 
add HashKey AS hashbytes('MD5', cast(convert(varchar(200), format(datestamp,'yyyy-MM-dd HH:mm:ss.ffffff')) as varbinary)) persisted 

datetime列,但因爲它是不確定的,我得到這個錯誤:

Computed column cannot be persisted because the column is non-deterministic.

我設法得到它不指定格式按以下步驟進行

alter table dbo.PolicyEventsFromQueue 
add HashKey AS hashbytes('MD5', cast(datestamp as varbinary)) persisted 

但在SQL Server中,當我看到的格式和無格式我收到了相同的字段值不同的結果的結果:

Select 
    convert(varchar(200), hashbytes('MD5', cast(convert(varchar(200), format(datestamp, 'yyyy-MM-dd HH:mm:ss.ffffff')) as varbinary)), 1) 
From 
    Events 
Where 
    DateStamp ='2016-06-30 12:19:35.257961' 

結果:

0xBE06A33FF10644A6D3B38EA134DDB97A 

第二個查詢:

select 
    hashbytes('MD5', cast('2016-06-30 12:19:35.257961' as varbinary)) 

結果:

0xBE06A33FF10644A6D3B38EA134DDB97A 

第三個查詢:

Select 
    convert(varchar(200), hashbytes('MD5', cast(DateStamp as varbinary)), 1) 
From 
    Events 
Where 
    DateStamp = '2016-06-30 12:19:35.257961' 

結果:

0x3CB5C26B23EB4422515764686DFCAB82 

基於以上研究我的理解是將SQL Server轉換郵戳爲另一種格式,然後散列。

但是,當我使用下面的函數獲取相同日期(「2016-06-30 12:19:35.257961」)的C#等效值時,它與散列值(0x3CB5C26B23EB4422515764686DFCAB82)不匹配。

public static byte[] GetMD5Hash(string input) 
{ 
     System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
     byte[] bs = System.Text.Encoding.Unicode.GetBytes(input); 

     bs = x.ComputeHash(bs); 

     return bs; 
} 

任何人能熟知精確匹配日期時間格式,因爲它採取的SQL Server和C#,使其與HashBytes工作。

注:我需要包括miiliseconds在內的所有日期。這個問題是後續問題。它可能會幫助你理解根本問題。

Need C# equivalent for the below SQL HashBytes function

+0

我得到了解決方案。我修改HashBytes邏輯如下所示,以獲得所需的日期時間格式,並在C#端我使用默認編碼。 )從事件 中選擇hashbytes('MD5',convert(varchar(200),(CONVERT(varchar(10),datestamp,126)+''+ CONVERT(VARCHAR(24),datestamp,114)),2) \t \t \t \t Where DateStamp ='2016-06-30 12:19:35.257961'' –

+0

您應該將答案作爲該問題的答案,並將其標記爲正確的解決方案。 –

回答

0

我得到了解決方案。我修改HashBytes邏輯如下所示,以獲得所需的日期時間格式,並在C#端我使用默認編碼。選擇哈希字節('MD5',convert(varchar(200),(CONVERT(varchar(10),datestamp,126)+''+ CONVERT(VARCHAR(24),datestamp,114)),2) ='2016-06-30 12:19:35.257961'