如何在SQL Server和Postgres中比较两个表列的哈希值?

我在 SQL Server 2017 中有一个表,该表有很多行,并且该表与数据一起迁移到了 Postgres 10.5 我的同事使用Talend做到了工具)。

我想比较迁移后数据是否正确。我想比较 SQL Server Postgres 中的列中的值。

我可以尝试将列从 SQL服务器 Postgres 中的 Numpy系列项目中读取,并进行比较。

但是两个DB都不在我的本地计算机中。它们托管在我需要从网络访问的服务器上,这意味着数据检索将花费大量时间。

相反,我想做这样的事情。

对由 primary_key 排序的列值执行 sha256 md5 哈希,并比较两个数据库中的哈希值,这意味着我不会无需从数据库中检索结果到我的本地进行比较。

如果该列具有完全相同的值,则该函数或某些内容应为哈希返回相同的值。

我什至不确定这是否可行,或者还有更好的方法。

有人可以指出我的方向吗?

gh88186024 回答:如何在SQL Server和Postgres中比较两个表列的哈希值?

如果FDW无法为您解决问题,则哈希比较可能是个好主意。 MD5可能是一个好主意,只是因为您应该从不同的软件获得一致的结果。

很显然,您需要使两个数据库中的列具有相同的顺序,才能进行哈希比较。如果布局不同,则可以在Postgres中创建一个视图以匹配SQL Server中的列顺序。

一旦您有要比较的表/视图,在Postgres端就有一个散列的快捷方式。想象一个名为facility的表:

SELECT MD5(facility::text) FROM facility;

如果不是很明显,这就是其中的内容。 Postgres可以将任何复合类型转换为文本。喜欢:

select your_table_here::text from your_table_here

结果类似于以下示例:

(2be4026d-be29-aa4a-a536-de1d7124d92d,2200d1da-73e7-419c-9e4c-efe020834e6f,"Powder Blue",Central,f)

注意结果周围的(括号)。在SQL Server端生成哈希时,您需要考虑到这一点。这段精巧的代码剥去了括号:

SELECT MD5(substring(facility::text,2,length(facility::text))) FROM facility;

或者,您可以手动将列连接为字符串,然后对其进行哈希处理。如果您具有在导入过程中自动更改的ID或时间戳字段,则可能需要这样做或使用视图。

::强制转换运算符还可以将行强制转换为另一种类型(如果已进行转换)。在上面列出了表格的位置,您也可以使用视图。

在SQL Server方面,我不知道。 HASHBYTES

本文链接:https://www.f2er.com/3160516.html

大家都在问