【问题标题】:HashBytes with datetime2 field带有 datetime2 字段的 HashBytes
【发布时间】:2016-08-02 14:08:31
【问题描述】:

我正在使用多列上的哈希字节创建一个哈希键,以获得我们现在在 where 子句中使用的性能增益。

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

但其中一列是我无法添加的 datetime2 字段。当我尝试时,我收到以下错误消息

“表 'table1' 中的计算列 'HashKey' 无法持久化,因为该列是不确定的。”。

根据我的研究,我发现不能使用 datetime2,因为它是不确定的。

但我无法更改格式,因为我需要完全比较该值,因为它包括所有毫秒。

任何人都可以给我一个解决方法吗?任何替代解决方案将不胜感激。

【问题讨论】:

  • 我从未听说过非确定性数据类型。似乎您正在做的事情与 checkum-function 几乎相同:msdn.microsoft.com/en-us/library/ms189788.aspx
  • 如果表达式列表中的某个值发生变化,则列表的校验和一般也会发生变化。但是,校验和不会改变的可能性很小。因此,我们不建议使用 CHECKSUM 来检测值是否已更改,除非您的应用程序可以容忍偶尔丢失更改。我们不能容忍这种情况:)

标签: sql hash datetime2 hashbytes


【解决方案1】:

我不确定它的含义..

但是将日期时间转换为二进制总是会给出新值。请参阅下面的示例..

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))

【讨论】:

  • 我按照你的建议做了。 alter table dbo.Table1 add HashKey AS CAST(hashbytes('MD5', PID+PNumber+CONVERT(VARCHAR(50),cast(datestamp as binary))+CONVERT(VARCHAR(50), TransactionCount)+OCD+ONbr+TransactionID) AS VARBINARY(80)) PERSISTED 它现在工作。谢谢
  • 实际上我现在面临的问题是获取哈希字节生成值的 c# 等效值。因为我们已将日期戳转换为二进制,然后再转换为 varchar。现在我无法获得相同的 c# 等效值。任何帮助将不胜感激。我在这里发布了另一个问题stackoverflow.com/questions/38739141/…
  • 转换为BINARY 有效但VARCHAR 无效的原因是CAST 从日期时间到字符串是locale 特定的。因此,非确定性警告;可以随时更改 Windows 或 SQL Server 的区域设置。使用CONVERT(VARCHAR(100),datestamp,126) 获取标准化的ISO-8601 格式字符串,然后在C# 应用程序上执行相同操作,并且您的哈希值应该匹配(假设其他字段都是具有相同编码的字符串)。
猜你喜欢
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
相关资源
最近更新 更多