将 sql 结果集聚合为 HashBytes 值

Posted

技术标签:

【中文标题】将 sql 结果集聚合为 HashBytes 值【英文标题】:Aggregate sql resultset into HashBytes value 【发布时间】:2013-08-16 23:05:14 【问题描述】:

有没有等价的

CHECKSUM_AGG(CHECKSUM(*)) 

对于哈希字节?

我知道你能做到

SELECT 
    HashBytes('MD5', 
        CONVERT(VARCHAR,Field1) + '|' 
      + CONVERT(VARCHAR,Field2) + '|'
      + CONVERT(VARCHAR,field3) + '|'
    )
FROM MyTable

但我不确定如何将所有计算的哈希字节记录聚合到 SQL 中的单个值中。

我想要这样做的一个原因是,在将数据移动到我的系统之前,确定自上次加载以来源表中的数据是否发生了变化。

【问题讨论】:

尝试对所有内容进行哈希字节选择? 这并不能回答您的问题,但如果您想确定数据是否更改,您应该查看rowversion。 【参考方案1】:

如果您想检查给定行是否已更改,我强烈建议您使用“时间戳”列。 每次修改行时,Sql Server 都会自动更新该值。 那么如果某一行发生了变化,那么修改后的值就会不一样,不用执行逻辑也不需要查询整张表就可以注意到。

但如果您想知道是否至少有一行已更新,我建议您使用:

DECLARE @Tablename sysname = 'MyTable';

SELECT modify_date FROM sys.tables WHERE name = @Tablename;

(如果您在业务层中使用 .Net,您可能会对 SqlDependency 感兴趣)

【讨论】:

【参考方案2】:

您可以遍历所有记录并将哈希合并为一个

declare @c cursor;
declare @data varchar(max);
declare @hash varchar(400) = '';

set @c = cursor fast_forward for
    select cast(SomeINTData as varchar(50)) + SomeTextData
    from TFact
    where Year = @year
        and Month = @month;

open @c
fetch next from @c into @data
while @@FETCH_STATUS = 0 begin
    set @hash = HASHBYTES('sha1', @hash + @data)

    fetch next from @c into @data
end

select @hash Ha

【讨论】:

以上是关于将 sql 结果集聚合为 HashBytes 值的主要内容,如果未能解决你的问题,请参考以下文章

将两个 SQL 查询的结果组合为单独的列

将 hashbytes() 函数的输出插入表中

SQL Server HashBytes 函数

MSSQL Sql加密函数 hashbytes 用法简介

SQL Uniqueidentifier 和 hashbytes 与 c# 不匹配

SQL Server ->> 校检函数CHECKSUMCHECKSUM_AGGBINARY_CHECKSUM和HASHBYTES