Eu tenho dois bancos de dados - Database1 e Database2.
Ambos os bancos de dados contêm uma tabela que possui estrutura semelhante, exemplificada a seguir:
==================================================== =========================================== | Identificação | Nome | TelefoneNoFormato | DialingCountryCode | InternationalDialingCode | InternetTLD | ==================================================== =========================================== | | | | | | | ==================================================== ===========================================
Porém, por algum motivo, (a) uma das tabelas de um dos bancos de dados possui dados que não são exatamente os mesmos que (b) os contidos na outra tabela do outro banco de dados.
Então, como posso comparar Database1.Table1
contra Database2.Table1
?
Tentei usar a seguinte consulta, mas nada aconteceu, então queria saber se tenho que reescrevê-la:
SELECT MIN(TableName) as TableName,
ID,
Name,
PhoneNoFormat,
DialingCountryCode,
InternationalDialingCode,
InternetTLD
FROM
(
SELECT 'Table A' as TableName,
A.ID,
A.Name,
A.PhoneNoFormat,
A.DialingCountryCode,
A.InternationalDialingCode,
A.InternetTLD
FROM [D:\DATABASE1.MDF].[dbo].[Table1] AS A
UNION ALL
SELECT 'Table B' as TableName,
B.ID, B.Name,
B.PhoneNoFormat,
B.DialingCountryCode,
B.InternationalDialingCode,
B.InternetTLD
FROM [D:\DATABASE2.MDF].[dbo].[Table1] AS B
) tmp
GROUP BY ID, Name, PhoneNoFormat, DialingCountryCode, InternationalDialingCode, InternetTLD
HAVING COUNT(*) = 1
ORDER BY ID
O nome do seu banco de dados não pode ser [D:\DATABASE1.MDF], esse pode ser o caminho para o arquivo físico de dados. Portanto, o nome completo da tabela (nome de 3 partes como em db.schema.table) é [DATABASE1].[dbo].[Table1].
Se for uma tarefa única, use o Red Gate SQL Data Compare . É uma ótima ferramenta e oferece uma versão de teste.
Se você tiver o Visual Studio Professional, também deverá ter a ferramenta de comparação de dados dentro dele. É outra ótima ferramenta para comparar dados e esquemas.
Se você não tiver acesso a nenhuma outra ferramenta para comparar os dados em duas tabelas, eu usaria o tablediff.exe, que está incluso na instalação do SQL Server. Você o encontrará no caminho do programa SQL Server. Detalhes aqui , no MSDN.
Se você quiser usar SQL, então você pode usar a função binary_checksum (ou seu parente, checksum ) para gerar um hash e comparar duas versões diferentes da mesma linha, caso você possa comparar linha por linha. Você também pode usar as funções para cada coluna, não apenas para a linha completa (claro, linha por linha, com base em uma chave). Veja um exemplo aqui .
Você pode usar EXCEPT como uma maneira rápida e suja de comparar dados em duas tabelas com estrutura de coluna idêntica.
Isso localizará linhas em Database1.dbo.Table1 que não estão presentes em Database2.dbo.Table1 (ou seja, linhas em Database1.dbo.Table1 que não têm uma correspondência exata de coluna por coluna em Database2.dbo.Table1).
Se você sabe que as linhas devem ter os mesmos valores de chave primária, você pode unir essa chave e visualizar as linhas incompatíveis lado a lado:
Esse é um truque antigo que encontrei em algum lugar deste site.
Eu não usaria isso em nenhum código de produção, com todo o SELECT *, mas para consultas interativas rápidas, não deve haver nenhum dano.
Se você está procurando algo mais visual, um truque é usar qualquer ferramenta de compaixão (no meu caso Devart Code Compare) e copiar/colar o conteúdo (selecione *) de cada tabela: