SQL Server中是否可以获取整个表的md5?例如,通过 hashbytes

问题描述 投票:0回答:1

我们想要获取整个表的md5校验和来验证数据的一致性,例如使用 SQL Server 的

hashbytes()
功能。

作为概念验证的中间步骤,我们找到了一种将所有列连接成一个文本字符串的方法,这样我们就可以获得表中每一行的 md5 校验和。请参阅以下示例 SQL 作为示例。

select
  hashbytes('md5',
    ''
    + col_1
    + col_2
      ...
    + col_n
    + char(0)+char(0)+char(13)+char(10)
  )
from the_table
;

但是,我们想知道如何获取整个表的md5校验和。

理想情况下,我们希望在输入源文本文件上运行

md5sum
,并希望与导入的数据库表中的 md5 校验和相匹配。

我们非常感谢任何提示和建议。

sql-server md5 checksum
1个回答
0
投票

虽然我同意@JoelCoehoorn的评论,但是可以通过某些方式回答表的特定md5哈希值。

请注意,即使您获得表的 md5,您也需要考虑 NULL、空字符串、空格、nvarchar 与 varchar、FLOATS 的不同样式、数字等。还要注意,文件通常有换行符和列分隔符,这当然会被转换为数据库中的行。

创建 md5 的一种简单方法是通过 FOR JSON 中介来完成:

select HASHBYTES('md5', (
   select *
   from sys.objects
   order by object_id
   for json path, include_null_values)
  )

请注意,这会创建 jsonfied 表内容的 USC-2 字符串,当涉及 HASHBYTES 时,该字符串与纯 ASCII 或 UTF8/16 具有不同的特征。因此,当您创建文件时,您需要在创建 json 内容时使用相同的技术。

您还可以尝试通过执行以下操作来模仿文件内容本身:

select HASHBYTES('md5', (
   select CONCAT(name, CHAR(9), object_id, CHAR(9), schema_id, CHAR(10))
   from sys.objects
   order by object_id for xml path(''),type).value('text()[1]','NVARCHAR(MAX)')
  )

这将创建一个制表符分隔的“文件”字符串 作为行分隔符,然后进行 MD5 处理。在这里,我使用 FOR XML“技巧”,它允许轻松地从表创建文本 blob。请注意,您需要通过执行 CONCAT 函数调用来手动构建“列”。

所以,是的,虽然技术上可行,但内容匹配存在很多挑战。通常,最好进行某种手动哈希,比较行数、SUM 等一些关键指标,以确保您导入的内容与您首先想要导入的内容相匹配

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.