【问题标题】:Aggregate sql resultset into HashBytes value将 sql 结果集聚合为 HashBytes 值
【发布时间】: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

标签: sql sql-server tsql


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      相关资源
      最近更新 更多