Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Berbagai Cara untuk Membandingkan Skema dan Data Tabel SQL Server

SQL Server memberi kami solusi berbeda untuk mereplikasi atau mengarsipkan tabel database atau tabel ke database lain, atau database yang sama dengan nama berbeda. Sebagai Pengembang SQL Server atau Administrator Basis Data, Anda mungkin menghadapi situasi ketika Anda perlu memeriksa apakah data dalam dua tabel ini identik, dan jika, karena kesalahan, data tidak direplikasi di antara dua tabel ini, Anda perlu menyinkronkan data antara tabel. Selain itu, jika Anda menerima pesan galat, yang merusak sinkronisasi data atau proses replikasi, karena perbedaan skema antara tabel sumber dan tujuan, Anda perlu menemukan cara yang mudah dan cepat untuk mengidentifikasi perbedaan skema, MENGUBAH tabel yang akan dibuat skema identik di kedua sisi dan melanjutkan proses sinkronisasi data.

Dalam situasi lain, Anda memerlukan cara mudah untuk mendapatkan jawaban YA atau TIDAK, jika data dan skema dua tabel identik atau tidak. Pada artikel ini, kita akan membahas berbagai cara untuk membandingkan data dan skema antara dua tabel. Metode yang disediakan dalam artikel ini akan membandingkan tabel yang di-host di database yang berbeda, yang merupakan skenario yang lebih rumit, dan juga dapat dengan mudah digunakan untuk membandingkan tabel yang terletak di database yang sama dengan nama yang berbeda.

Sebelum menjelaskan metode dan alat yang berbeda yang dapat digunakan untuk membandingkan data tabel dan skema, kami akan menyiapkan lingkungan demo kami dengan membuat dua database baru dan membuat satu tabel di setiap database, dengan satu perbedaan tipe data kecil antara dua tabel ini, sebagai ditunjukkan dalam pernyataan T-SQL CREATE DATABASE dan CREATE TABLE di bawah ini:

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

Setelah membuat database dan tabel, kita akan mengisi dua tabel dengan lima baris yang identik, kemudian menyisipkan record baru lainnya di tabel pertama saja, seperti yang ditunjukkan pada pernyataan T-SQL INSERT INTO di bawah ini:

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

Sekarang lingkungan pengujian siap untuk mulai menjelaskan metode perbandingan data dan skema.

Bandingkan Data Tabel Menggunakan LEFT JOIN

Kata kunci LEFT JOIN T-SQL digunakan untuk mengambil data dari dua tabel, dengan mengembalikan semua record dari tabel kiri dan hanya record yang cocok dari tabel kanan dan nilai NULL dari tabel kanan ketika tidak ada kecocokan antara dua tabel.

Untuk tujuan perbandingan data, kata kunci LEFT JOIN dapat digunakan untuk membandingkan dua tabel, berdasarkan kolom unik umum seperti kolom ID dalam kasus kami, seperti pada pernyataan SELECT di bawah ini:

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

Kueri sebelumnya akan mengembalikan lima baris umum yang ada di dua tabel, selain baris yang ada di tabel pertama dan hilang dari yang kedua, dengan menunjukkan nilai NULL di sisi kanan hasil, seperti yang ditunjukkan di bawah ini:

Anda dapat dengan mudah memperoleh dari hasil sebelumnya bahwa, kolom keenam yang ada di tabel pertama terlewatkan dari tabel kedua. Untuk menyinkronkan baris di antara tabel, Anda perlu memasukkan catatan baru ke tabel kedua secara manual. Metode LEFT JOIN berguna dalam memverifikasi baris baru tetapi tidak akan membantu dalam hal memperbarui nilai kolom. Jika Anda mengubah nilai kolom Alamat baris ke-5, metode LEFT JOIN tidak akan mendeteksi perubahan itu seperti yang ditunjukkan dengan jelas di bawah ini:

Bandingkan Data Tabel Menggunakan Klausa KECUALI

Pernyataan KECUALI mengembalikan baris dari kueri pertama (kueri kiri) yang tidak dikembalikan dari kueri kedua (kueri kanan). Dengan kata lain, pernyataan EXCEPT akan mengembalikan perbedaan antara dua pernyataan atau tabel SELECT, yang membantu kita dengan mudah membandingkan data dalam tabel ini.
Pernyataan EXCEPT dapat digunakan untuk membandingkan data pada tabel yang dibuat sebelumnya, dengan mengambil perbedaan antara query SELECT * dari tabel pertama dan query SELECT * dari tabel kedua, menggunakan pernyataan T-SQL di bawah ini:

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

Hasil dari query sebelumnya adalah baris yang tersedia pada tabel pertama dan tidak tersedia pada tabel kedua, seperti pada gambar di bawah ini:

Menggunakan pernyataan KECUALI untuk membandingkan dua tabel lebih baik daripada pernyataan LEFT JOIN dalam hal itu, catatan yang diperbarui akan ditangkap dalam hasil perbedaan data. Asumsikan kita telah memperbarui Alamat baris nomor 5 pada tabel kedua, dan memeriksa perbedaannya menggunakan pernyataan KECUALI, Anda akan melihat bahwa baris nomor 5 akan dikembalikan dengan hasil perbedaan seperti yang ditunjukkan di bawah ini:

Satu-satunya kelemahan menggunakan pernyataan KECUALI untuk membandingkan data dalam dua tabel adalah bahwa Anda perlu menyinkronkan data secara manual dengan menulis pernyataan INSERT untuk catatan yang hilang di tabel kedua. Mempertimbangkan bahwa dua tabel yang dibandingkan adalah tabel berkunci untuk mendapatkan hasil yang benar, dengan kunci unik yang digunakan untuk perbandingan. Jika kita menghapus kolom unik ID dari pernyataan SELECT di kedua sisi pernyataan KECUALI, dan mencantumkan kolom non-kunci lainnya, seperti pada pernyataan di bawah ini:

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

Hasilnya akan menunjukkan bahwa hanya catatan baru yang dikembalikan, dan yang diperbarui tidak akan terdaftar, seperti yang ditunjukkan pada hasil di bawah ini:

Bandingkan Data Tabel Menggunakan UNION ALL … GROUP BY

Pernyataan UNION ALL juga dapat digunakan untuk membandingkan data dalam dua tabel, berdasarkan kolom kunci yang unik. Untuk menggunakan pernyataan UNION ALL untuk mengembalikan perbedaan antara dua tabel, Anda perlu membuat daftar kolom untuk dibandingkan dalam pernyataan SELECT dan menggunakan kolom ini dalam klausa GROUP BY, seperti yang ditunjukkan dalam kueri T-SQL di bawah ini:

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

Dan hanya baris yang ada di tabel pertama dan terlewat dari tabel kedua yang akan dikembalikan seperti gambar di bawah ini:

Kueri sebelumnya juga akan berfungsi dengan baik dalam hal memperbarui catatan tetapi dengan cara yang berbeda. Ini akan mengembalikan catatan yang baru dimasukkan selain kolom yang diperbarui dari kedua tabel, seperti dalam kasus baris nomor 5, yang ditunjukkan di bawah ini:

Bandingkan Data Tabel Menggunakan Alat Data SQL Server

Alat Data SQL Server, juga dikenal sebagai SSDT, dibangun di atas Microsoft Visual Studio dapat dengan mudah digunakan untuk membandingkan data dalam dua tabel dengan nama yang sama, berdasarkan kolom kunci unik, dihosting di dua database berbeda dan menyinkronkan data dalam tabel ini , atau buat skrip sinkronisasi untuk digunakan nanti.

Dari jendela SSDT yang terbuka, klik menu Alat -> daftar SQL Server dan pilih Perbandingan Data Baru pilihan, seperti yang ditunjukkan di bawah ini:

Di jendela koneksi yang ditampilkan, Anda dapat memilih dari sesi yang terhubung sebelumnya, atau mengisi jendela Connection Properties dengan nama SQL Server, kredensial, dan nama database, lalu klik Connect , seperti yang ditunjukkan di bawah ini:

Di wizard Perbandingan Data Baru yang ditampilkan, tentukan nama database sumber dan target serta opsi perbandingan yang digunakan dalam proses perbandingan tabel, lalu klik Berikutnya , seperti yang ditunjukkan di bawah ini:

Di jendela berikutnya, tentukan nama tabel, yang harus sama dengan nama di database sumber dan target, yang akan dibandingkan di kedua database dan klik Finish , seperti di bawah ini:

Hasil yang ditampilkan akan menunjukkan kepada Anda jumlah record yang ditemukan di sumber dan meleset dari target, ditemukan di target dan terlewat dari sumber, jumlah record yang diperbarui dengan kunci yang sama dan nilai kolom yang berbeda (Rekaman Berbeda) dan akhirnya jumlah record identik yang ditemukan di kedua tabel, seperti yang ditunjukkan di bawah ini:

Klik nama tabel di hasil sebelumnya, Anda akan menemukan tampilan detail dari temuan ini, seperti yang ditunjukkan di bawah ini:

Anda dapat menggunakan alat yang sama untuk membuat skrip untuk menyinkronkan tabel sumber dan target atau memperbarui tabel target secara langsung dengan perubahan yang hilang atau berbeda, seperti di bawah ini:

Jika Anda mengklik opsi Generate Script, pernyataan INSERT dengan kolom yang hilang di tabel target akan ditampilkan, seperti yang ditunjukkan di bawah ini:
MULAI TRANSAKSI

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

Memilih opsi Update Target akan meminta konfirmasi Anda terlebih dahulu untuk melakukan perubahan, seperti pada pesan di bawah ini:

Setelah sinkronisasi, Anda akan melihat bahwa data di kedua tabel akan identik, seperti yang ditunjukkan di bawah ini:

Bandingkan Data Tabel Menggunakan Alat Pihak Ketiga “dbForge Studio for SQL Server”

Di dunia SQL Server, Anda dapat menemukan sejumlah besar alat pihak ketiga yang memudahkan kehidupan administrator dan pengembang database. Salah satu alat ini, yang membuat tugas administrasi basis data menjadi mudah, adalah dbForge Studio untuk SQL Server, yang memberi kita cara mudah untuk melakukan tugas administrasi dan pengembangan basis data. Alat ini juga dapat membantu kita dalam membandingkan data dalam tabel database dan menyinkronkan tabel tersebut.

Dari menu Perbandingan, pilih Perbandingan Data Baru pilihan, seperti yang ditunjukkan di bawah ini:

Dari wizard Perbandingan Data Baru, tentukan sumber dan basis data target, lalu klik Berikutnya :

Pilih opsi yang sesuai dari berbagai pilihan pemetaan dan perbandingan yang tersedia, lalu klik Berikutnya :

Tentukan nama tabel atau tabel yang akan ikut dalam proses perbandingan data. Wizard akan menampilkan pesan peringatan jika ada perbedaan skema antara tabel database sumber dan target. Klik Bandingkan untuk melanjutkan:

Hasil akhir akan menunjukkan kepada Anda secara rinci, perbedaan data antara tabel sumber dan target, dengan kemampuan untuk mengklik untuk menyinkronkan tabel sumber dan tujuan, seperti yang ditunjukkan di bawah ini:

Bandingkan Skema Tabel Menggunakan sys.columns

Seperti yang disebutkan di awal artikel ini, untuk mereplikasi atau mengarsipkan tabel, Anda perlu memastikan bahwa skema tabel sumber dan target identik. SQL Server memberi kita berbagai cara untuk membandingkan skema tabel dalam database yang sama atau database yang berbeda. Metode pertama adalah mengkueri tampilan katalog sistem sys.columns, yang mengembalikan satu baris untuk setiap kolom objek yang memiliki kolom, dengan properti setiap kolom.

Untuk membandingkan skema tabel yang terletak di database yang berbeda, Anda perlu menyediakan sys.columns dengan nama tabel di bawah database saat ini, tanpa dapat menyediakan tabel yang dihosting di database lain. Untuk mencapainya, kita akan melakukan query sys.columns dua kali, menyimpan hasil dari setiap query dalam tabel temp dan terakhir membandingkan hasil dari kedua query tersebut menggunakan perintah EXCEPT T-SQL, seperti yang ditunjukkan dengan jelas di bawah ini:

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

Hasilnya akan menunjukkan kepada kita bahwa, definisi kolom Alamat berbeda di kedua tabel ini, tanpa informasi khusus tentang perbedaan yang tepat, seperti yang ditunjukkan di bawah ini:

Bandingkan Skema Tabel Menggunakan INFORMATION_SCHEMA.COLUMNS

Tampilan sistem INFORMATION_SCHEMA.COLUMNS dapat juga digunakan untuk membandingkan skema tabel yang berbeda, dengan memberikan nama tabel. Sekali lagi, untuk membandingkan dua tabel yang dihosting di database yang berbeda, kami akan meminta INFORMATION_SCHEMA.COLUMNS dua kali, menyimpan hasil setiap kueri dalam tabel temp dan akhirnya membandingkan hasil dari dua kueri ini menggunakan perintah KECUALI T-SQL, seperti yang ditunjukkan jelas di bawah ini:

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

Dan hasilnya akan mirip dengan yang sebelumnya, menunjukkan bahwa definisi kolom Alamat berbeda di kedua tabel ini, tanpa informasi spesifik tentang perbedaan persisnya, seperti yang ditunjukkan di bawah ini:

Bandingkan Skema Tabel Menggunakan dm_exec_describe_first_result_set

Skema tabel juga dapat dibandingkan dengan menanyakan fungsi manajemen dinamis dm_exec_describe_first_result_set, yang menggunakan pernyataan Transact-SQL sebagai parameter dan menjelaskan metadata dari kumpulan hasil pertama untuk pernyataan tersebut.

Untuk membandingkan skema dua tabel, Anda perlu menggabungkan dm_exec_describe_first_result_set DMF dengan dirinya sendiri, memberikan pernyataan SELECT dari setiap tabel sebagai parameter, seperti pada kueri T-SQL di bawah ini:

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

Hasilnya akan lebih jelas kali ini, seperti yang dapat Anda bandingkan dengan mata, perbedaan antara dua tabel, yaitu ukuran dan jenis kolom Alamat, seperti yang ditunjukkan di bawah ini:

Bandingkan Skema Tabel Menggunakan Alat Data SQL Server

Alat Data SQL Server juga dapat digunakan untuk membandingkan skema tabel yang terletak di database yang berbeda. Di bawah menu Alat, pilih Perbandingan Skema Baru dari daftar opsi SQL Server, seperti yang ditunjukkan di bawah ini:

Setelah memberikan parameter koneksi, klik tombol Bandingkan:

Hasil perbandingan akan menunjukkan kepada Anda, secara spesifik, perbedaan skema antara dua tabel dalam bentuk perintah CREATE TABLE T-SQL, diarsir seperti pada snapshot di bawah ini:

Anda dapat dengan mudah mengklik untuk menyinkronkan skema tabel atau klik untuk membuat skrip perubahan dan melakukannya nanti, seperti yang ditunjukkan di bawah ini:

Bandingkan Skema Tabel Menggunakan dbForge Studio untuk Alat Pihak Ketiga SQL Server

Alat dbForge Studio untuk SQL Server memberi kita kemampuan untuk membandingkan skema tabel database yang berbeda. Dari menu Perbandingan, pilih Perbandingan Skema Baru pilihan, seperti di bawah ini:

Setelah menentukan properti koneksi dari database sumber dan target, pilih opsi pemetaan yang sesuai, dari pilihan yang tersedia dan klik Berikutnya :

Pilih skema yang akan Anda bandingkan objeknya dan klik Berikutnya :

Tentukan tabel atau tabel yang akan berpartisipasi dalam proses perbandingan skema dan klik Bandingkan , jika Anda ingin melewatkan perubahan pengaturan default di jendela Filter Objek, seperti di bawah ini:

Hasil perbandingan yang ditampilkan akan menunjukkan kepada Anda perbedaan antara skema dua tabel, dengan secara tepat menyorot bagian tipe data yang berbeda antara dua kolom, dengan kemampuan untuk menentukan tindakan apa yang harus dilakukan untuk menyinkronkan kedua tabel, seperti yang ditunjukkan di bawah ini :

Jika Anda mengatur untuk menyinkronkan skema dari dua tabel, klik tombol dan tentukan di wizard Sinkronisasi Skema jika Anda berhasil menjalankan perubahan secara langsung pada tabel target, atau hanya skrip untuk digunakan di masa mendatang, seperti di bawah ini:

Tautan Berguna:

  • Tetapkan Operator – KECUALI dan INTERSECT (Transact-SQL)
  • Tetapkan Operator – UNION (Transact-SQL)
  • Unduh Alat Data SQL Server (SSDT)
  • Bandingkan dan Sinkronkan Data dalam Satu atau Beberapa Tabel dengan Data dalam Basis Data Referensi
  • sys.dm_exec_describe_first_result_set (Transact-SQL)
  • sys.columns (Transact-SQL)
  • Tampilan Skema Informasi Sistem (Transact-SQL)

Alat yang berguna:

dbForge Schema Compare for SQL Server – alat andal yang menghemat waktu dan tenaga Anda saat membandingkan dan menyinkronkan database di SQL Server.

dbForge Data Compare for SQL Server – alat perbandingan SQL canggih yang mampu bekerja dengan data besar.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ujian Tip dan Petunjuk administrasi Azure SQL Database (DP-300)

  2. Apa alat terbaik untuk membandingkan dua database SQL Server (skema dan data)?

  3. Cara Mengekstrak atau Mengonversi Data Waktu dari String di SQL Server

  4. Cara Mengembalikan Stempel Waktu Unix di SQL Server (T-SQL)

  5. Cara Mengembalikan Hasil Kueri sebagai Daftar Dipisahkan Koma di SQL Server – STRING_AGG()