我正在尝试检查两个数据库之间的数据加载结果。不幸的是,我只能直接访问一个数据库(MySQL),管理MSSQL的公司可以通过API向我们公开它。
我想要做的是检查行集中某些列的一致性。最初,我曾希望能够对列进行CRC或散列检查,但似乎没有兼容的方法。
例如,我们可以针对MySQL中的列运行CRC32,但是在MSSQL上没有可靠的方法。或者,在MSSQL上有CHECKSUM_AGG,但在MySQL上没有其他选择。
最终结果是,如果校验和不同以确定需要更改的行,我想进行二进制搜索。
目前没有批量加载界面,SSIS不可用(MSSQL服务器不属于我公司)。
答案 0 :(得分:2)
我以为我会回到这里并描述我们最终实施的解决方案。这是脖子上的一个主要痛苦!
首先,由于我们服务器上MySQL的固定版本和远程服务器上的MSSQL,因此没有常见的编码方法。 MSSQL API以UTF-16LE返回数据,MySQL数据库中的Unicode数据存储在Latin-1表中叹息
首先,我们连接了我们正在比较的字段,然后我们对结果进行了MD5。为了使MySQL结果与MSSQL HASHBYTES函数的输出相匹配,我们必须这样做:
SELECT ABS(CONV(CONCAT(
IF(MID(MD5(CONC), -8 , 1) >= "8", "FFFFFFFF", ""),
RIGHT(MD5(CONC), 8)
), 16, -10 )) AS CALC
其中CONC是子选择连接我们感兴趣的字段的结果。
在MSSQL服务器上,我们必须执行以下查询:
SELECT ABS(CONVERT(INT,HASHBYTES('MD5',
CONVERT(NVARCHAR(4000), FIELD1 ) +
CONVERT(NVARCHAR(4000), FIELD2 ) + ...
然后,根据Chinese Remainder Theorem
,我们在整个范围内取得了MD5的总和,以三个大数模(311,313,317)为模。这为我们检查的范围提供了三个数字。我们可以合理地确定,如果每个服务器上的所有三个数字都匹配给定范围,那么数据就是一致的。
我将不遗余力地告诉你我们必须要做的事情,以便将Latin-1中的Unicode音译为UTF-16LE