Estamos tentando comparar os valores de tabelas inteiras entre muitos bancos de dados. O usuário pode inserir na entrada os nomes das tabelas e das colunas e os nomes dos bancos de dados que deseja comparar.
Eles podem inserir quantos bancos de dados, tabelas e colunas desejarem. Queremos comparar linhas por linhas, apenas para as colunas especificadas.
ex:
DatabaseA, DatabaseB, DatabaseC
Table1, Col1|Col2|Col3|Col4
Table2, Col1|Col4|Col5|Col6|Col20
...
Então, por exemplo, se eu tiver:
DatabaseA
Table1, Col1|Col2|Col3|Col4 = 'Apple', 1, 10, 'ABC'
DatabaseB
Table1, Col1|Col2|Col3|Col4 = 'Banana', 1, 10, 'ABC'
Há uma diferença.
No começo, eu estava pensando em usar o CHECKSUM em cada linha se cada tabela (excluindo as colunas que não foram especificadas pelo usuário) e comparar o CHECKSUM, mas li que nem sempre é único.
Agora eu estava pensando em usar HASHBYTES. Ou fazendo isso:
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
Ou fazendo isso:
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
O que você acha? Como você faria? Qual seria a melhor forma?
Obrigado
Isso pode não ser exatamente o que você está procurando fazer, mas você pode usar a instrução EXCEPT para obter as linhas diferentes:
Se você fizer desta forma, certifique-se de fazer também o contrário, EXCETO para saber as linhas que não existem na tabela do outro banco de dados:
Espero que isso ajude você um pouco.
Por fim, decidimos que a melhor maneira de fazer isso é com a soma de verificação. A razão é: queremos comparar linhas por linhas para as colunas especificadas (cuja soma de verificação permite que você especifique).
A princípio queríamos ir com hashbytes, mas como Mikael me disse, tem um limite de 8000 bytes, e isso é realmente muito pequeno.
E embora a solução de Adam seja boa, não é exatamente o que queremos fazer.
Então nossa solução é: