12

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

4 回答 4

10
select HashBytes('md5',convert(varbinary(max),(SELECT * FROM MyChildTable WHERE ParentId = 2 FOR XML AUTO)))

但是 HashBytes 仅限于 8000 字节...您可以创建一个函数来获取每 8000 字节的 de Md5 ....

于 2014-03-07T13:34:22.013 回答
9

您可以使用CHECKSUM_AGG聚合。它是为此目的而制造的。

于 2012-08-08T11:16:22.967 回答
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
于 2012-08-08T10:55:15.957 回答
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;
于 2013-10-10T12:40:50.043 回答