T -SQL - Existe uma maneira (gratuita) de comparar dados em duas tabelas?
-
26-09-2019 - |
Pergunta
Eu tenho table a
e table b
. (SQL Server 2008)
Ambas as tabelas têm exatamente o mesmo esquema.
Para os propósitos desta questão, considere table a
= minha tabela de dev local, table b
= A tabela viva.
Eu preciso criar um script SQL (contendo UPDATE/DELETE/INSERT
declarações) que atualizarão a Tabela B como a mesma da Tabela a. Esse script será implantado no banco de dados ao vivo.
Alguma ferramenta gratuita por aí que pode fazer isso, ou melhor ainda, uma maneira de fazer isso sozinho?
Estou pensando que provavelmente preciso fazer algum tipo de ingresso em todos os campos nas tabelas e, em seguida, gerar SQL dinâmico com base nisso.
Alguém tem alguma ideia?
EDITAR
Ok, pensei em esclarecer um pouco essa pergunta.
A tabela que eu preciso sincronizar é uma tabela de pesquisa simples. Os dados são muito simples e diretos.
Aqui está uma ideia do que TABLE A
Pode parecer:
IdFoo Activity IsFoo
1 Foo 1
2 Bar 0
Aqui está uma ideia do que TABLE B
Pode parecer:
IdFoo Activity IsFoo
1 Foo 1
2 Bar 1
Basicamente, tudo o que quero fazer é atualizar que BIT
coluna (IsFoo
) dentro TABLE B
Para corresponder ao valor correspondente em TABLE A
Para o mesmo Idfoo.
Tenha em mente:
TABLE A
está na minha máquina localTABLE B
está no servidor ao vivo
Obviamente eu tenho um backup (confiável) de TABLE B
Na minha máquina local, com o qual preciso script e execute o script no servidor ao vivo.
A tabela também possui integridade referencial (outras colunas que eu não mostrei). O que significa que não posso simplesmente excluir tudo em TABLE B
e fazer uma inserção de TABLE A
.
Este script será um único. Portanto, não há necessidade de fazer coisas como servidor vinculado, replicação, etc. Aprecie as respostas. =)
EDITAR:
OK - então eu fui com a resposta de Oleg (VS2010 Data Compare). Rápido, fácil e trabalha um charme.
Para não dizer que as outras respostas estão incorretas. Agradeço todas as respostas!
Solução
Em casos muito simples, você poderá definir em seu servidor SQL local um novo servidor vinculado (consulte no Microsoft SQL Server Management Studio em "Objetos do servidor" / "servidor vinculado") e use INNER JOIN
e OUTER JOIN
Para descobrir diferenças entre as tabelas A e B.
Em uma situação real e mais complexa, você deve levar em consideração a integridade referencial, diferentes teclas estrangeiras e campos de identidade (Auto Incremental) existentes no banco de dados de destino, para que o script de atualização seja mais complexo. Então, recomendo que você não gaste seu tempo na criação de sincronização do seu desenvolvedor e banco de dados de produção e use uma ferramenta padrão. Eu uso, por exemplo, os recursos do Visual Studio Team Edition 2008 (ou edição do banco de dados) ou do Visual Studio 2010 Ultimate Edition para comparar dados em dois bancos de dados. Funciona muito bem.
Outras dicas
Resposta tardia, mas pode ser útil para os visitantes do tópico
Além de outras soluções mencionadas, posso sugerir a tentativa de dados do ApexSQL Diff. Ele pode comparar e sincronizar os dados do banco de dados do SQL Server (em bancos de dados ao vivo e backups) e automatizar e agendar migrações de dados. Também funciona com grandes bancos de dados e é capaz de executar comparações diretamente do SSMS.
Você pode baixar esta ferramenta gratuitamente e brincar com ela. Possui uma avaliação gratuita totalmente funcional e oferece uma edição da comunidade (após o término do período de teste) que funciona no banco de dados SQL Express e Azure SQL.
Para saber mais sobre a ferramenta, você pode visitar http://www.apexsql.com/sql_tools_datadiff.aspx
Se você deseja apenas sincronizar as tabelas e não se importa em revisar as mudanças antecipadamente o Mesclar O comando pode fazer isso.
O Microsoft SSDT (gratuito) também possui dados de comparação e sincronização incorporados, embora seja mais limitado do que as ferramentas pagas, como os dados do Redgate.
Há Os dados do SQL comparam de Redgate (embora não livre) e também há SMO e a construídas em Função funcional.
Finalmente Wikipedia Tem uma lista bastante abrangente de software.
Como é um, você pode usar esta consulta para encontrar linhas diferentes nessas duas tabelas:
(SELECT * FROM TABLE_A
MINUS
SELECT * FROM TABLE_B)
UNION ALL
(SELECT * FROM TABLE_B
MINUS
SELECT * FROM TABLE_A)
MINUS
Comparará os registros de campo por campo, ele descartará os registros da primeira tabela para os quais há registro idêntico na segunda tabela. Isso funciona como este:
- Primeiro
MINUS
obtém todos os registros deTABLE_A
que não estão emTABLE_B
- Segundo
MINUS
obtém todos os registros deTABLE_B
que não estão emTABLE_A
- A Union obtém todos os registros de ambas as tabelas para as quais não há registro correspondente em outra tabela.
Agora você pode inserir esses registros em alguma tabela de temperatura e depois fazer inserções/atualizações.
Dependendo das suas necessidades, você pode restringir a lista de campo para comparar.
Observe que você precisa de chave primária para que isso funcione.
Editar:
Ooops. O SQL Server não suporta MINUS
operador. Estou trabalhando com o Oracle no ano passado e meio, então isso foi automático.
Você pode usar EXCEPT
operador em vez disso. Veja este artigo: Exceto e intersect (transact-sql)
Editar 2:
Ré Scherand's Comente:
Se ele realmente não pode se conectar da máquina local ao servidor ao vivo, ele pode simplesmente despejar TABLE_A
e carregue -o no servidor. De uma maneira ou de outra, o objetivo é alterar os dados da tabela no servidor ao vivo.
Eu corri o mesmo problema que você - pesquisei uma ferramenta gratuita que compara dados de duas tabelas MS SQL - e não encontrei nada. Em seguida, criei um utilitário simples da linha de comando freeware. Compara dados de duas tabelas e cria INSERT/DELETE/UPDATE
StatemENets para criar dados da tabela de destino iguais à fonte. Agora estou usando -o para comparação de dados e, como é totalmente gratuito, pode recomendar verificar isso em: Sourceforge.net - Ultradbc
Você pode usar um gerador de script de dados que cria script para as inserções e, em seguida, usar uma ferramenta de comparação de arquivos, como o WinMerge, para comparar os arquivos para encontrar as diferenças. Há um artigo sobre como gerar os scripts de dados no projeto de código: http://www.codeproject.com/kb/database/sqlinsertupdategerator.aspx
Tablediff funcionaria - é gratuito e vem com o SQL Serverhttp://msdn.microsoft.com/en-us/library/ms162843.aspx
Você também pode tentar usar o import and export data
Fornecido pelo SQL Server 2008. É uma maneira bastante direta de copiar todos os dados de qualquer lugar para qualquer lugar. Eu faço a mesma coisa e funciona perfeitamente.
Você pode tentar o nosso Esquema Compare para SQL Server
Essa ferramenta não é gratuita (é shareware), mas você pode usar o teste de 30 dias de graça e também tem a oportunidade de obter uma licença gratuita para este produto - consulte o nosso Página de condições de licença grátis.
O que acontece se você:
- Copie devtablea para prod,
- suspender as dependências do ProdtableB
- renomear prodtable b para prodtableB1,
- renomear devtablea para prodtableb
- dependências de reimplementar em novo ProdtableB
- Teste o novo ProdtableB e depois exclua o nome de Old Prodtableb.
?
Ou se você tiver que ser mais respeitoso com o ProdtableB existente e seus valores de coluna de identidade em Match dev e Prod (mesmo que os valores não sejam contínuos) ...
declare @iLast int, @x int, @y int
select @iLast = (select MAX(id) from prodTableB)
set @x = 1
while @x <= @iLast
begin
select @y = (select COUNT(*) from prodTableB where id = @x)
if @y = 1
begin
update prodTableB set isFoo = (select isFoo from devTableA where id=@x
end
@x=@x+1
end
Você também pode dar uma olhada Os dados XSQL comparam. A versão SQL Express é gratuita e também há uma versão Lite que fará o truque para pequenos bancos de dados.
Uma boa ferramenta gratuita também é comparada com os dados de SSDT.
Isenção de responsabilidade: sou afiliado ao XSQL.