我们正在尝试在许多数据库之间比较整个表的值。用户可以输入表名和列名,以及他想要比较的数据库名。
他们可以输入任意数量的数据库、表格和列。我们想比较每行的行数,只针对指定的列。
ex:
DatabaseA, DatabaseB, DatabaseC
Table1, Col1|Col2|Col3|Col4
Table2, Col1|Col4|Col5|Col6|Col20
...
例如,如果我有:
DatabaseA
Table1, Col1|Col2|Col3|Col4 = 'Apple', 1, 10, 'ABC'
DatabaseB
Table1, Col1|Col2|Col3|Col4 = 'Banana', 1, 10, 'ABC'
有区别。
起初,如果每个表(不包括用户未指定的列),我正在考虑在每行上使用 CHECKSUM 并比较 CHECKSUM,但我读过它并不总是唯一的。
现在我正在考虑使用 HASHBYTES 代替。通过这样做:
SELECT HASHBYTES('sha2_512', CONVERT(NVARCHAR(MAX), ISNULL(col1,'')) +
HASHBYTES('sha2_512', CONVERT(NVARCHAR(MAX), ISNULL(col2,'')) +
HASHBYTES('sha2_512', CONVERT(NVARCHAR(MAX), ISNULL(col3,'')) +
HASHBYTES('sha2_512', CONVERT(NVARCHAR(MAX), ISNULL(col4,'')) +
FROM Table1
或者通过这样做:
With Vals AS
(
SELECT CONVERT(NVARCHAR(MAX), ISNULL(col1, '')) +
CONVERT(NVARCHAR(MAX), ISNULL(col2, '')) +
CONVERT(NVARCHAR(MAX), ISNULL(col3, '')) +
CONVERT(NVARCHAR(MAX), ISNULL(col4, '')) AS Val
FROM Table1
)
SELECT HASHBYTES ('sha2_512', Val) FROM Vals
你怎么看?你会怎么做?最好的方法是什么?
谢谢
这可能不是您想要做的,但您可以使用 EXCEPT 语句来获取不同的行:
但是,如果您这样做,请确保您也执行相反的操作,除非您知道其他数据库表中不存在的行:
希望对您有所帮助。
最后,我们决定最好的方法是使用校验和。原因是:我们想比较指定列的每行行数(您可以指定校验和)。
起初我们想使用哈希字节,但正如 Mikael 告诉我的那样,它有 8000 字节的限制,这真的太小了。
尽管亚当的解决方案是一个很好的解决方案,但它并不是我们想要做的。
所以我们的解决方案是: