sql-server - 如何使用哈希字节(如校验和)?

标签 sql-server hash checksum

在 SQL Server 中,我们可以使用“校验和”轻松地在整行上生成哈希:

select 
checksum(*), *    
from mytable

有没有办法使用 hashbytes 函数来做同样的事情? 像这样的东西:

select 
hashbytes('md5', *), *    
from mytable

最佳答案

恐怕不容易。在大多数情况下,您不应该真正想要这样做。但如果必须的话,为每一行生成一个 XML 文档并对 XML 文档进行哈希处理可能是最简单的方法:

SELECT  HASHBYTES('MD5', X.value)
FROM    Data
CROSS APPLY (
    SELECT value = 
        CAST((SELECT Data.* FROM   (SELECT 1) AS X (y) FOR XML AUTO) AS VARCHAR(MAX))
) AS X

编辑:我做了一些测试,应用 CAST(... AS VARCHAR(MAX)) 正如我在上面更新的语句中所做的那样,改进了性能约15%。更重要的是,它可以防止宽表上的截断错误。即使经过此修复,您自己连接列的速度仍然快了 15% 左右。使用 CONCAT()(MSSQL 2012 中提供)函数可以让您的生活变得更轻松,因为您可以省略对每列应用 ISNULL 和 CAST 函数。

关于sql-server - 如何使用哈希字节(如校验和)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28581888/

相关文章:

java - 如何将 sqljdbc_auth.dll 添加到我的 Maven 项目

sql - 为每个 ID 复制一组日期

ruby - 方法如何在 Ruby 中使用散列参数?

c++ - 什么方法可以创建 16 字节校验和

c++ - 每次重新编译后exe校验和不同

c# - 更新数据库中的信息

Java: "prime"数字或 "power of two"作为 HashMap 大小?

c++ - StringHashTable 线程安全中使用的静态函数?

c - Internet Checksum 函数是否移动 8bits

c# - Malscript 注入(inject) SQL Server 2005 数据库