将 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 Uniqueidentifier 和 hashbytes 与 c# 不匹配
SQL Server ->> 校检函数CHECKSUMCHECKSUM_AGGBINARY_CHECKSUM和HASHBYTES