Maneiras de comparar e encontrar diferenças para tabelas e dados do SQL Server

Por: Daniel Calbimonte | Actualizado: 2019-05-22 | Comentários (24) | Relacionados: 1 | 2 | 3 | 4 | Mais > Comparação de Dados e Objectos

h5>Problema

Por vezes precisamos de comparar tabelas e/ou dados do SQL Server para saber o que foi alterado. Esta dica mostra diferentes formas de comparar dados, tipos de dados e tabelas utilizando o SQLServer.

Solução

Mostrar-lhe-ei diferentes métodos para identificar as alterações. Digamos que temos duas tabelas semelhantes em bases de dados diferentes e queremos saber o que é diferente.

Aqui está um script que cria amostras de bases de dados, tabelas e dados.

CREATE DATABASE dbtest01GOUSE dbtest01GOCREATE TABLE . ( (10) NOT NULL, (10) NULL, (10) NULL, CONSTRAINT PRIMARY KEY CLUSTERED ( ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ) ON GOINSERT INTO . VALUES ('001', '1', '40'), ('002', '2', '80'), ('003', '3', '120')GOCREATE DATABASE dbtest02GOUSE dbtest02GOCREATE TABLE . ( (10) NOT NULL, (10) NULL, (10) NULL, CONSTRAINT PRIMARY KEY CLUSTERED ( ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ) ON GOINSERT INTO . VALUES ('001', '1', '40'), ('002', '2', '80'), ('003', '3', '120'), ('004', '4', '160')GO

O código T-SQL gera 2 tabelas em bases de dados diferentes. Os nomes das tabelas são os mesmos, mas a tabela na base de dados dbtest02 contém uma linha extra como mostrado em baixo:

As tabelas

Vamos olhar para formas de comparar estas tabelas usando métodos diferentes.

Comparar dados do SQL Server em tabelas usando um LEFT JOIN

Com o LEFT JOIN podemos comparar valores de colunas específicas que não são comuns entre duas tabelas.

Por exemplo:

SELECT *FROM dbtest02.dbo.article d2LEFT JOIN dbtest01.dbo.article d1 ON d2.id = d1.id 

A junção da esquerda mostra todas as linhas da tabela da esquerda “dbtest02.dbo.article”, mesmo que não haja correspondência na tabela “dbtest01.dbo.article”:

Left join

Neste exemplo, estamos a comparar 2 tabelas e os valores de NULL são exibidos se não houver linhas correspondentes. Este método funciona para verificar novas filas, mas se actualizarmos outras colunas, o LEFT JOIN não ajuda.

Isto pode ser feito de ambas as maneiras para ver se existem diferenças a outra alternativa. Esta consulta apenas retornará as 3 linhas correspondentes.

SELECT *FROM dbtest01.dbo.article d1LEFT JOIN dbtest02.dbo.article d2 ON d1.id = d2.id

Comparar dados do SQL Server em tabelas usando a cláusula de EXCEPTO

Excepção mostra a diferença entre duas tabelas (os tipos do Oracle useminus em vez de except e a sintaxe e utilização é a mesma). É utilizado para comparar as diferenças entre duas tabelas. Por exemplo, vejamos as diferenças entre as duas tabelas:

p>Agora vamos executar uma consulta usando except:

SELECT * FROM dbtest02.dbo.articleEXCEPTSELECT * FROM dbtest01.dbo.article

p>The except retorna a diferença entre as tabelas de dbtest02 e dbtest01:

Excepção

Se virarmos as tabelas na consulta, não veremos quaisquer registos, porque a tabela da base de dados dbtest02 tem todos os registos mais um extra.

SELECT * FROM dbtest01.dbo.articleEXCEPTSELECT * FROM dbtest02.dbo.article

Este método é melhor do que o primeiro, porque se alterarmos valores para outras colunas como o tipo e o custo, EXCEPTO notará a diferença.

Aqui está anexado um exemplo se actualizarmos a id “001” na base de dados dbtest01 e alterarmos o custo de “40 “para “1”. Se actualizarmos os registos e depois executarmos a consulta novamente, veremos estas diferenças agora:

exceto diferenças de cláusula

Felizmente não cria um script para sincronizar as tabelas.

Comparar os dados do SQL Server em tabelas usando a ferramenta Tablediff

Existe uma boa ferramenta de linha de comando usada para comparar tabelas. Isto pode ser encontrado na pasta “C:\Program Files\Microsoft SQL Server\110\COM Esta ferramenta de linha de comando é usada para comparar tabelas. Também gera um script com as instruções INSERT, UPDATE eDELETE para sincronizar as tabelas. Para mais detalhes, consultar este diffarticle.

Compare SQL Server Data in Tables Using Change Data Capture (CDC)

Esta funcionalidade está disponível no SQL Server 2008 e posteriores. É necessário activar esta funcionalidade e também é necessário ter o SQL Server Agent a funcionar. Basicamente, cria tabelas de sistema que acompanham as alterações nas suas tabelas que pretende monitorizar. Não compara tabelas, mas segue as alterações nas tabelas.

Para mais informações, consulte estas dicasChange Data Capture (CDC).

Compare SQL Server Data Types Between Two Tables

O que acontece se quisermos comparar os tipos de dados? Existe uma forma de comparar os tipos de dados?

Sim, podemos utilizar as . visualizações do sistema para verificar e comparar a informação. Vamos criar uma nova tabela com o nome dbo.article2 com coluna de dados diferente da tabela dbo.article:

USE dbtest01GOCREATE TABLE .( NOT NULL, nchar(10) NULL, nchar(10) NULL, CONSTRAINT PRIMARY KEY CLUSTERED ( ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ) ON GO

A diferença é que a id é agora uma int em vez denchar(10) como as outras tabelas.

A consulta para comparar tipos de dados de tabelas artigo e artigo1 seria:

USE dbtest01GOSELECT c1.table_name, c1.COLUMN_NAME, c1.DATA_TYPE, c2.table_name, c2.DATA_TYPE, c2.COLUMN_NAMEFROM . c1LEFT JOIN . c2 ON c1.COLUMN_NAME = c2.COLUMN_NAMEWHERE c1.TABLE_NAME = 'article' AND c2.TABLE_NAME = 'article2' AND c1.data_type <> c2.DATA_TYPE

Os resultados são os seguintes:

Excepção

A consulta compara os tipos de dados destas duas tabelas. Todas as informações das colunas podem ser obtidas a partir da visão do sistema . Estamos a comparar a tabela “artigo” com a tabela “artigo2” e a mostrar se algum dos tipos de dados é diferente.

Comparar se existem colunas extra entre as tabelas do SQL Server

Algumas vezes temos de nos certificar de que duas tabelas contêm o mesmo número de colunas.Para ilustrar isto, vamos criar uma tabela chamada “article3” com 2 colunas extra nomeadas extra1 e extra2:

USE dbtest01GOCREATE TABLE .( NOT NULL, nchar(10) NULL, nchar(10) NULL, extra1 int, extra2 int)

Para comparar as colunas, vou utilizar esta consulta:

USE dbtest01GOSELECT c2.table_name, c2.COLUMN_NAMEFROM . c2WHERE table_name = 'article3' AND c2.COLUMN_NAME NOT IN ( SELECT column_name FROM . WHERE table_name = 'article' )

A consulta compara as diferentes colunas entre a tabela “artigo” e “artigo3”.As diferentes colunas são extra1 e extra2. Este é o resultado da consulta:

compare extra columns

Compare SQL Server Tables in Different Databases

Now let’s compare the tables in database dbtest01 and dbtest02. A seguinte pesquisa mostrará as diferentes tabelas em dbtest01 em comparação com dbtest02:

SELECT 'dbtest01' AS dbname, t1.table_nameFROM dbtest01.. t1WHERE table_name NOT IN ( SELECT t2.table_name FROM dbtest02.. t2 )UNIONSELECT 'dbtest02' AS dbname, t1.table_nameFROM dbtest02.. t1WHERE table_name NOT IN ( SELECT t2.table_name FROM dbtest01.. t2 )

>div>>compare tables between databasescomparar tabelas entre bases de dados

Terceiras Ferramentas de Festa

Existem excelentes ferramentas para comparar tabelas incluindo dados e esquemas. Pode utilizar oVisualStudio ou utilizar outras ferramentas de comparação de servidoresSQL.

Passos seguintes
  • Existem múltiplas ferramentas e formas de comparar dados e esquemas. Seleccione o método que melhor se adapta às suas necessidades.
  • >li>Para mais informações, consulte estes links:

    • ServidorSQL Excepto
    • li>ServidorSQL Juntar-se à esquerdali>ServidorSQL Alterar Captura de dados

    • Servidor Tablediff Utility

br>Última Actualização: 2019-05-22

get scripts
botão da próxima dica

h5>Sobre o autor

SSQLTips author Daniel CalbimonteDaniel Calbimonte é um Microsoft SQL Server MVP, Formador Certificado Microsoft e Microsoft Certified IT Professional.
Ver todas as minhas dicas

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *