Hashbytes Computed column cannot be persisted because the column is non-deterministic
Hashbytes Computed column cannot be persisted because the column is non-deterministic
我正在尝试使用 HashBytes
散列 datetime
列
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
但由于它是不确定的,我得到这个错误:
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 服务器中,当我看到带格式和不带格式的结果时,我得到相同字段值的不同结果:
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 服务器正在将日期戳转换为另一种格式,然后进行哈希处理。
但是当我使用下面的函数获得相同日期(“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 服务器和 C# 来匹配日期时间格式,使其与 HashBytes
一起工作。
注意:我需要包括毫秒在内的所有日期。这个问题是以下问题的后续问题。它可能会帮助您了解根本问题。
我得到了解决方案。我如下修改了 HashBytes 逻辑以获得所需的日期时间格式,并且在 C# 端,我使用的是默认编码。
Select hashbytes('MD5', convert(varchar(200),(CONVERT(varchar(10),datestamp,126)+' '+CONVERT(VARCHAR(24),datestamp,114)),2))
from Events
Where DateStamp ='2016-06-30 12:19:35.257961'
我正在尝试使用 HashBytes
datetime
列
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
但由于它是不确定的,我得到这个错误:
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 服务器中,当我看到带格式和不带格式的结果时,我得到相同字段值的不同结果:
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 服务器正在将日期戳转换为另一种格式,然后进行哈希处理。
但是当我使用下面的函数获得相同日期(“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 服务器和 C# 来匹配日期时间格式,使其与 HashBytes
一起工作。
注意:我需要包括毫秒在内的所有日期。这个问题是以下问题的后续问题。它可能会帮助您了解根本问题。
我得到了解决方案。我如下修改了 HashBytes 逻辑以获得所需的日期时间格式,并且在 C# 端,我使用的是默认编码。
Select hashbytes('MD5', convert(varchar(200),(CONVERT(varchar(10),datestamp,126)+' '+CONVERT(VARCHAR(24),datestamp,114)),2))
from Events
Where DateStamp ='2016-06-30 12:19:35.257961'