SQL Server 2012中是否有任何方法可以生成一组行和列的哈希值?
我想生成一个哈希值,将其存储在父记录中。当更新进来时,我会将传入的哈希值与父记录哈希值进行比较,并且我将知道数据是否已更改。
所以这样的事情会很好:
SELECT GENERATEHASH(CONCATENATE(Name, Description, AnotherColumn))
FROM MyChildTable WHERE ParentId = 2 -- subset of data belong to parent record 2
“CONCATENATE”将是一个聚合函数,它不仅可以连接列,还可以连接结果集中的行。像MAX一样,但是将所有内容都作为字符串连接返回。
希望这有助于你了解我的意思!
我试图解决的根本问题是我的客户端系统执行大量分层数据的导入。如果我可以通过使用哈希来避免处理,那么我认为这将节省大量时间。目前,当必须处理重复数据时,SP的运行速度要慢300%。
非常感谢
答案 0 :(得分:9)
您可以使用CHECKSUM_AGG汇总。它是为此目的而制作的。
答案 1 :(得分:9)
select HashBytes('md5',convert(varbinary(max),(SELECT * FROM MyChildTable WHERE ParentId = 2 FOR XML AUTO)))
但是HashBytes仅限于8000字节...你可以创建一个函数来为每8000字节获得de Md5 ....
答案 2 :(得分:2)
对于单行哈希:
select HASHBYTES('md5', Name + Description + AnotherColumn)
FROM MyChildTable WHERE ParentId = 2
表校验和:
select sum(checksum(Name + Description + AnotherColumn)*1.0)
FROM MyChildTable WHERE ParentId = 2
答案 3 :(得分:1)
另一种方法:
-- compute a single hash value for all rows of a table
begin
set nocount on;
-- init hash variable
declare @tblhash varchar(40);
set @tblhash = 'start';
-- compute a single hash value
select @tblhash = sys.fn_varbintohexsubstring(0, hashbytes('sha1',(convert(varbinary(max),@tblhash+
(select sys.fn_varbintohexsubstring(0,hashbytes('sha1',(convert(varbinary(max),
-- replace 'select *' if you want only specific columns to be included in the hash calculation
-- [target table] is the name of the table to calc the hash from
-- [row_id] is the primary key column within the target table
-- modify those in the next lines to suit your needs:
(select * from [target_table] obj2 where obj2.[row_id]=obj1.[row_id] for xml raw)
))),1,0))
))),1,0)
from [target_table] obj1;
set nocount off;
-- return result
select @tblhash as hashvalue;
end;