将sql结果集聚合为HashBytes值

时间:2013-08-14 20:00:12

标签: sql sql-server tsql

是否等同于

CHECKSUM_AGG(CHECKSUM(*)) 

对于HashBytes?

我知道你可以做到

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

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

我想要这样做的一个原因是确定在将数据移入我的系统之前,自上次加载以来源表中的数据是否已更改。

2 个答案:

答案 0 :(得分:1)

如果要检查给定行是否已更改,我强烈建议您使用“timestamp”列。 每次修改时,Sql Server会自动更新该值。 然后,如果一行被更改,修改后的值会有所不同,您可以在没有实现逻辑或查询整个表的情况下注意到它。

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

DECLARE @Tablename sysname ='MyTable';

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

(如果你在业务层使用.Net,那么你可能会对SqlDependency有所了解)

答案 1 :(得分:0)

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

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