为sql server中的一组行生成哈希

时间:2012-08-08 10:51:41

标签: sql-server tsql

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%。

非常感谢

4 个答案:

答案 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;