Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Diversi modi per confrontare lo schema e i dati delle tabelle di SQL Server

SQL Server ci fornisce diverse soluzioni per replicare o archiviare una o più tabelle di database in un altro database o nello stesso database con nomi diversi. In qualità di sviluppatore di SQL Server o amministratore di database, potresti trovarti di fronte a situazioni in cui devi verificare che i dati in queste due tabelle siano identici e se, per errore, i dati non vengono replicati tra queste due tabelle, devi sincronizzare i dati tra i tavoli. Inoltre, se si riceve un messaggio di errore che interrompe il processo di sincronizzazione o replica dei dati, a causa di differenze di schema tra le tabelle di origine e di destinazione, è necessario trovare un modo semplice e veloce per identificare le differenze di schema, ALTER le tabelle da creare lo schema è identico su entrambi i lati e riprende il processo di sincronizzazione dei dati.

In altre situazioni, è necessario un modo semplice per ottenere la risposta SÌ o NO, se i dati e lo schema di due tabelle sono identici o meno. In questo articolo, esamineremo i diversi modi per confrontare i dati e lo schema tra due tabelle. I metodi forniti in questo articolo confronteranno le tabelle che sono ospitate in database diversi, che è lo scenario più complicato, e possono anche essere facilmente utilizzati per confrontare le tabelle che si trovano nello stesso database con nomi diversi.

Prima di descrivere i diversi metodi e strumenti che possono essere utilizzati per confrontare i dati delle tabelle e gli schemi, prepareremo il nostro ambiente demo creando due nuovi database e creeremo una tabella in ogni database, con una piccola differenza di tipo di dati tra queste due tabelle, come mostrato nelle istruzioni CREATE DATABASE e CREATE TABLE T-SQL di seguito:

CREATE DATABASE TESTDB
CREATE DATABASE TESTDB2
CREATE TABLE TESTDB.dbo.FirstComTable
( ID INT IDENTITY (1,1) PRIMARY KEY,
  FirstName VARCHAR (50),
  LastName VARCHAR (50),
  Address VARCHAR (500)
)
GO
CREATE TABLE TESTDB2.dbo.FirstComTable
( ID INT IDENTITY (1,1) PRIMARY KEY,
  FirstName VARCHAR (50),
  LastName VARCHAR (50),
  Address NVARCHAR (400)
)
GO

Dopo aver creato i database e le tabelle, riempiremo le due tabelle con cinque righe identiche, quindi inseriremo un altro nuovo record solo nella prima tabella, come mostrato nelle istruzioni INSERT INTO T-SQL di seguito:

INSERT INTO TESTDB.dbo.FirstComTable VALUES ('AAA','BBB','CCC')
GO 5
INSERT INTO TESTDB2.dbo.FirstComTable VALUES ('AAA','BBB','CCC')
GO 5
INSERT INTO TESTDB.dbo.FirstComTable VALUES ('DDD','EEE','FFF')
GO

Ora l'ambiente di test è pronto per iniziare a descrivere i metodi di confronto dei dati e degli schemi.

Confronta i dati delle tabelle utilizzando un join sinistro

La parola chiave LEFT JOIN T-SQL viene utilizzata per recuperare i dati da due tabelle, restituendo tutti i record dalla tabella di sinistra e solo i record corrispondenti dalla tabella di destra e i valori NULL dalla tabella di destra quando non c'è corrispondenza tra le due tabelle.

Ai fini del confronto dei dati, la parola chiave LEFT JOIN può essere utilizzata per confrontare due tabelle, in base alla colonna univoca comune come la colonna ID nel nostro caso, come nell'istruzione SELECT di seguito:

SELECT *
FROM TESTDB.dbo.FirstComTable F
LEFT JOIN TESTDB2.dbo.FirstComTable S
ON F.ID =S.ID

La query precedente restituirà le cinque righe comuni esistenti nelle due tabelle, oltre alla riga esistente nella prima tabella e mancante nella seconda, mostrando i valori NULL sul lato destro del risultato, come mostrato di seguito:

Puoi facilmente dedurre dal risultato precedente che la sesta colonna che esiste nella prima tabella è mancata dalla seconda tabella. Per sincronizzare le righe tra le tabelle, è necessario inserire manualmente il nuovo record nella seconda tabella. Il metodo LEFT JOIN è utile per verificare le nuove righe ma non aiuta nel caso di aggiornamento dei valori delle colonne. Se modifichi il valore della colonna Indirizzo della 5a riga, il metodo LEFT JOIN non rileverà tale modifica come mostrato chiaramente di seguito:

Confronta i dati delle tabelle utilizzando la clausola EXCEPT

L'istruzione EXCEPT restituisce le righe della prima query (query di sinistra) che non vengono restituite dalla seconda query (query di destra). In altre parole, l'istruzione EXCEPT restituirà la differenza tra due istruzioni o tabelle SELECT, che ci aiuta a confrontare facilmente i dati in queste tabelle.
L'istruzione EXCEPT può essere utilizzata per confrontare i dati nelle tabelle create in precedenza, prendendo la differenza tra la query SELECT * dalla prima tabella e la query SELECT * dalla seconda tabella, utilizzando le istruzioni T-SQL seguenti:

SELECT * FROM TESTDB.dbo.FirstComTable F
EXCEPT 
SELECT * FROM TESTDB2.dbo. FirstComTable S

Il risultato della query precedente sarà la riga disponibile nella prima tabella e non disponibile nella seconda, come mostrato di seguito:

L'utilizzo dell'istruzione EXCEPT per confrontare due tabelle è migliore dell'istruzione LEFT JOIN in quanto i record aggiornati verranno rilevati nel risultato delle differenze di dati. Supponiamo di aver aggiornato l'indirizzo della riga numero 5 nella seconda tabella e di aver verificato la differenza utilizzando nuovamente l'istruzione EXCEPT, vedrai che la riga numero 5 verrà restituita con il risultato delle differenze come mostrato di seguito:

L'unico svantaggio dell'utilizzo dell'istruzione EXCEPT per confrontare i dati in due tabelle è che è necessario sincronizzare i dati manualmente scrivendo un'istruzione INSERT per i record mancanti nella seconda tabella. Tenere in considerazione che le due tabelle che vengono confrontate sono tabelle con chiave per avere il risultato corretto, con una chiave univoca utilizzata per il confronto. Se rimuoviamo la colonna univoca ID dall'istruzione SELECT in entrambi i lati dell'istruzione EXCEPT ed elenchiamo il resto delle colonne non chiave, come nell'istruzione seguente:

SELECT FirstName, LastName, Address FROM TESTDB.dbo. FirstComTable F
EXCEPT 
SELECT FirstName, LastName, Address FROM TESTDB2.dbo. FirstComTable S

Il risultato mostrerà che vengono restituiti solo i nuovi record e quelli aggiornati non verranno elencati, come mostrato nel risultato seguente:

Confronta i dati delle tabelle utilizzando un UNION ALL … GROUP BY

L'istruzione UNION ALL può essere utilizzata anche per confrontare i dati in due tabelle, in base a una colonna chiave univoca. Per utilizzare l'istruzione UNION ALL per restituire la differenza tra due tabelle, è necessario elencare le colonne da confrontare nell'istruzione SELECT e utilizzare queste colonne nella clausola GROUP BY, come mostrato nella query T-SQL seguente:

SELECT DISTINCT * 
  FROM
  (
  SELECT * FROM 
  ( SELECT * FROM TESTDB.dbo. FirstComTable      
  UNION ALL
    SELECT * FROM TESTDB2.dbo. FirstComTable) Tbls
    GROUP BY ID,FirstName, LastName, Address
    HAVING COUNT(*)<2) Diff

E solo la riga che esiste nella prima tabella e persa dalla seconda tabella verrà restituita come mostrato di seguito:

La query precedente funzionerà bene anche nel caso di aggiornamento dei record ma in un modo diverso. Restituirà i record appena inseriti oltre alle colonne aggiornate di entrambe le tabelle, come nel caso della riga numero 5, mostrata di seguito:

Confronto dei dati delle tabelle utilizzando gli strumenti dati di SQL Server

SQL Server Data Tools, noto anche come SSDT, basato su Microsoft Visual Studio può essere facilmente utilizzato per confrontare i dati in due tabelle con lo stesso nome, in base a una colonna chiave univoca, ospitata in due database diversi e sincronizzare i dati in queste tabelle o generare uno script di sincronizzazione da utilizzare in seguito.

Dalla finestra SSDT aperta, fai clic sul menu Strumenti -> elenco SQL Server e scegli Nuovo confronto dati opzione, come mostrato di seguito:

Nella finestra di connessione visualizzata, puoi scegliere tra le sessioni connesse in precedenza, oppure riempire la finestra Proprietà di connessione con il nome di SQL Server, le credenziali e il nome del database, quindi fare clic su Connetti , come mostrato di seguito:

Nella procedura guidata Nuovo confronto dati visualizzata, specifica i nomi dei database di origine e di destinazione e le opzioni di confronto utilizzate nel processo di confronto delle tabelle, quindi fai clic su Avanti , come mostrato di seguito:

Nella finestra successiva, specifica il nome della tabella, che dovrebbe essere lo stesso nel database di origine e di destinazione, che verrà confrontato in entrambi i database e fai clic su Fine , come di seguito:

Il risultato visualizzato ti mostrerà il numero di record che si trovano nella sorgente e persi da quello di destinazione, trovati nel target e persi dalla fonte, il numero di record aggiornati con la stessa chiave e valori di colonne diversi (Record diversi) e infine il numero di record identici trovati in entrambe le tabelle, come mostrato di seguito:

Fai clic sul nome della tabella nel risultato precedente, troverai una vista dettagliata di questi risultati, come mostrato di seguito:

Puoi utilizzare lo stesso strumento per generare uno script per sincronizzare le tabelle di origine e di destinazione o aggiornare la tabella di destinazione direttamente con le modifiche mancanti o diverse, come di seguito:

Se fai clic sull'opzione Genera script, verrà visualizzata un'istruzione INSERT con la colonna mancante nella tabella di destinazione, come mostrato di seguito:
BEGIN TRANSACTION

BEGIN TRANSACTION
SET IDENTITY_INSERT [dbo].[FirstComTable] ON
INSERT INTO [dbo].[FirstComTable] ([ID], [FirstName], [LastName], [Address]) VALUES (6, N'DDD', N'EEE', N'FFF')
SET IDENTITY_INSERT [dbo].[FirstComTable] OFF
COMMIT TRANSACTION

Scegliendo l'opzione Aggiorna destinazione ti verrà chiesto prima la conferma per eseguire la modifica, come nel messaggio seguente:

Dopo la sincronizzazione, vedrai che i dati nelle due tabelle saranno identici, come mostrato di seguito:

Confronta i dati delle tabelle utilizzando lo strumento di terze parti "dbForge Studio per SQL Server"

Nel mondo di SQL Server puoi trovare un gran numero di strumenti di terze parti che semplificano la vita degli amministratori di database e degli sviluppatori. Uno di questi strumenti, che rende le attività di amministrazione del database un gioco da ragazzi, è dbForge Studio per SQL Server, che ci fornisce modi semplici per eseguire le attività di amministrazione e sviluppo del database. Questo strumento può anche aiutarci a confrontare i dati nelle tabelle del database e sincronizzare queste tabelle.

Dal menu Confronto, scegli Nuovo confronto dati opzione, come mostrato di seguito:

Dalla procedura guidata Nuovo confronto dati, specifica il database di origine e di destinazione, quindi fai clic su Avanti :

Scegli le opzioni adatte dall'ampia gamma di opzioni di mappatura e confronto disponibili e fai clic su Avanti :

Specificare il nome della tabella o delle tabelle che parteciperanno al processo di confronto dei dati. La procedura guidata visualizzerà un messaggio di avviso nel caso in cui vi siano differenze di schema tra le tabelle dei database di origine e di destinazione. Fai clic su Confronta per procedere:

Il risultato finale ti mostrerà in dettaglio, le differenze di dati tra le tabelle di origine e di destinazione, con la possibilità di fare clic per sincronizzare le tabelle di origine e di destinazione, come mostrato di seguito:

Confronta lo schema delle tabelle utilizzando sys.columns

Come indicato all'inizio di questo articolo, per replicare o archiviare una tabella, è necessario assicurarsi che lo schema delle tabelle di origine e di destinazione sia identico. SQL Server ci offre diversi modi per confrontare lo schema delle tabelle nello stesso database o in database diversi. Il primo metodo consiste nell'interrogare la vista del catalogo di sistema sys.columns, che restituisce una riga per ogni colonna di un oggetto che ha una colonna, con le proprietà di ciascuna colonna.

Per confrontare lo schema delle tabelle che si trovano in database diversi, è necessario fornire a sys.columns il nome della tabella nel database corrente, senza poter fornire una tabella ospitata in un altro database. Per ottenere ciò, interrogheremo due volte sys.columns, salveremo il risultato di ciascuna query in una tabella temporanea e infine confronteremo il risultato di queste due query utilizzando il comando EXCEPT T-SQL, come mostrato chiaramente di seguito:

USE TESTDB
SELECT name, system_type_id, user_type_id,max_length, precision,scale, is_nullable, is_identity INTO #DBSchema FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.FirstComTable')
GO
USE TestDB2
GO
SELECT name, system_type_id, user_type_id,max_length, precision,scale, is_nullable, is_identity INTO #DB2Schema FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.FirstComTable ');

GO 
SELECT * FROM #DBSchema
EXCEPT 
SELECT * FROM #DB2Schema

Il risultato ci mostrerà che la definizione della colonna Indirizzo è diversa in queste due tabelle, senza informazioni specifiche sulla differenza esatta, come mostrato di seguito:

Confronta lo schema delle tabelle utilizzando INFORMATION_SCHEMA.COLUMNS

La vista di sistema INFORMATION_SCHEMA.COLUMNS può essere utilizzata anche per confrontare lo schema di tabelle diverse, fornendo il nome della tabella. Anche in questo caso, per confrontare due tabelle ospitate in database diversi, eseguiremo una query su INFORMATION_SCHEMA.COLUMNS due volte, manterremo il risultato di ciascuna query in una tabella temporanea e infine confronteremo il risultato di queste due query utilizzando il comando EXCEPT T-SQL, come mostrato chiaramente sotto:

USE TestDB
SELECT COLUMN_NAME, IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION,NUMERIC_SCALE  INTO #DBSchema FROM [INFORMATION_SCHEMA].[COLUMNS] SC1
WHERE SC1.TABLE_NAME='FirstComTable'
GO
USE TestDB2
SELECT COLUMN_NAME, IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION,NUMERIC_SCALE INTO #DB2Schema FROM [INFORMATION_SCHEMA].[COLUMNS] SC2
 WHERE SC2.TABLE_NAME='FirstComTable'
GO 
SELECT * FROM #DBSchema
EXCEPT 
SELECT * FROM #DB2Schema

E il risultato sarà in qualche modo simile al precedente, mostrando che la definizione della colonna Indirizzo è diversa in queste due tabelle, senza informazioni specifiche sulla differenza esatta, come mostrato di seguito:

Confronta lo schema delle tabelle utilizzando dm_exec_describe_first_result_set

Gli schemi delle tabelle possono essere confrontati anche interrogando la funzione di gestione dinamica dm_exec_describe_first_result_set, che accetta un'istruzione Transact-SQL come parametro e descrive i metadati del primo set di risultati per l'istruzione.

Per confrontare lo schema di due tabelle, è necessario unire il DMF dm_exec_describe_first_result_set con se stesso, fornendo l'istruzione SELECT da ciascuna tabella come parametro, come nella query T-SQL seguente:

SELECT FT.name , ST.name  , 
FT.system_type_name  , ST.system_type_name ,
FT.max_length  , ST.max_length ,
FT.precision  , ST.precision ,
FT.scale  , ST.scale ,
FT.is_nullable  , ST.is_nullable , 
FT.is_identity_column  , ST.is_identity_column 
FROM sys.dm_exec_describe_first_result_set (N'SELECT * FROM TestDB.DBO.FirstComTable', NULL, 0) FT
LEFT OUTER JOIN  sys.dm_exec_describe_first_result_set (N'SELECT * FROM TestDB2.DBO.FirstComTable', NULL, 0) ST
ON FT.Name =ST.Name
GO

Il risultato questa volta sarà più chiaro, poiché potrai confrontare ad occhio la differenza tra le due tabelle, ovvero la dimensione e il tipo della colonna Indirizzo, come mostrato di seguito:

Confronto dello schema delle tabelle utilizzando SQL Server Data Tools

SQL Server Data Tools può essere utilizzato anche per confrontare lo schema di tabelle che si trovano in database diversi. Nel menu Strumenti, scegli Confronto nuovo schema opzione dall'elenco delle opzioni di SQL Server, come mostrato di seguito:

Dopo aver fornito i parametri di connessione, fare clic sul pulsante Confronta:

Il risultato del confronto ti mostrerà, in particolare, la differenza di schema tra le due tabelle sotto forma di comandi CREATE TABLE T-SQL, ombreggiati come nell'istantanea seguente:

Puoi facilmente fare clic per sincronizzare lo schema della tabella o fare clic su per eseguire lo script della modifica ed eseguirla in un secondo momento, come mostrato di seguito:

Confronta lo schema delle tabelle utilizzando dbForge Studio per lo strumento di terze parti di SQL Server

Lo strumento dbForge Studio per SQL Server ci offre la possibilità di confrontare lo schema delle diverse tabelle del database. Dal menu Confronto, scegli Nuovo confronto schema opzione, come di seguito:

Dopo aver specificato le proprietà di connessione dei database di origine e di destinazione, scegli l'opzione di mappatura adatta, tra le scelte disponibili e fai clic su Avanti :

Scegli gli schemi con cui confronterai il suo oggetto e fai clic su Avanti :

Specifica la tabella o le tabelle che parteciperanno al processo di confronto dello schema e fai clic su Confronta , se vuoi saltare la modifica delle impostazioni predefinite nella finestra Filtro oggetto, come di seguito:

Il risultato del confronto visualizzato ti mostrerà la differenza tra lo schema delle due tabelle, evidenziando esattamente la parte del tipo di dati che differisce tra le due colonne, con la possibilità di specificare quale azione fare per sincronizzare le due tabelle, come mostrato di seguito :

Se si desidera sincronizzare lo schema delle due tabelle, fare clic sul pulsante e specificare nella procedura guidata Schema Synchronization se si riesce ad eseguire la modifica direttamente sulla tabella di destinazione, o semplicemente eseguirne uno script da utilizzare in futuro, come di seguito:

Link utili:

  • Set Operators – EXCEPT e INTERSECT (Transact-SQL)
  • Set Operators – UNION (Transact-SQL)
  • Scarica SQL Server Data Tools (SSDT)
  • Confronta e sincronizza i dati in una o più tabelle con i dati in un database di riferimento
  • sys.dm_exec_describe_first_result_set (Transact-SQL)
  • sys.columns (Transact-SQL)
  • Viste dello schema delle informazioni di sistema (Transact-SQL)

Strumenti utili:

dbForge Schema Compare per SQL Server:uno strumento affidabile che consente di risparmiare tempo e fatica durante il confronto e la sincronizzazione dei database su SQL Server.

dbForge Data Compare per SQL Server:potente strumento di confronto SQL in grado di lavorare con i big data.