SQL Server cung cấp cho chúng tôi các giải pháp khác nhau để sao chép hoặc lưu trữ một bảng cơ sở dữ liệu hoặc các bảng sang cơ sở dữ liệu khác hoặc cùng một cơ sở dữ liệu với các tên khác nhau. Là một Nhà phát triển SQL Server hoặc Quản trị viên Cơ sở dữ liệu, bạn có thể gặp phải các tình huống khi cần kiểm tra xem dữ liệu trong hai bảng này có giống hệt nhau không và nếu do nhầm lẫn, dữ liệu không được sao chép giữa hai bảng này, bạn cần phải đồng bộ hóa dữ liệu giữa các bảng. Ngoài ra, nếu bạn nhận được thông báo lỗi làm hỏng quá trình đồng bộ hóa hoặc sao chép dữ liệu, do sự khác biệt về giản đồ giữa bảng nguồn và bảng đích, bạn cần tìm một cách dễ dàng và nhanh chóng để xác định sự khác biệt về lược đồ, thay thế các bảng cần tạo giản đồ giống hệt nhau ở cả hai phía và tiếp tục quá trình đồng bộ hóa dữ liệu.
Trong các tình huống khác, bạn cần một cách dễ dàng để nhận được câu trả lời CÓ hoặc KHÔNG, nếu dữ liệu và lược đồ của hai bảng giống hệt nhau hoặc không. Trong bài viết này, chúng ta sẽ xem xét các cách khác nhau để so sánh dữ liệu và lược đồ giữa hai bảng. Các phương pháp được cung cấp trong bài viết này sẽ so sánh các bảng được lưu trữ trong các cơ sở dữ liệu khác nhau, đây là trường hợp phức tạp hơn và cũng có thể dễ dàng được sử dụng để so sánh các bảng nằm trong cùng một cơ sở dữ liệu với các tên khác nhau.
Trước khi mô tả các phương pháp và công cụ khác nhau có thể được sử dụng để so sánh dữ liệu bảng và lược đồ, chúng tôi sẽ chuẩn bị môi trường demo của mình bằng cách tạo hai cơ sở dữ liệu mới và tạo một bảng trong mỗi cơ sở dữ liệu, với một sự khác biệt nhỏ về kiểu dữ liệu giữa hai bảng này, như được hiển thị trong các câu lệnh T-SQL CREATE DATABASE và CREATE TABLE T-SQL dưới đây:
CREATE DATABASE TESTDBCREATE DATABASE TESTDB2CREATE TABLE TESTDB.dbo.FirstComTable (ID INT IDENTITY (1,1) PRIMARY KEY, FirstName VARCHAR (50), LastName VARCHAR (50), Address VARCHAR (500)) GOCREATE TABLE TESTDB2.dbo. FirstComTable (ID INT IDENTITY (1,1) PRIMARY KEY, FirstName VARCHAR (50), LastName VARCHAR (50), Address NVARCHAR (400)) ĐI
Sau khi tạo cơ sở dữ liệu và bảng, chúng tôi sẽ điền vào hai bảng với năm hàng giống nhau, sau đó chèn một bản ghi mới khác chỉ trong bảng đầu tiên, như được hiển thị trong câu lệnh INSERT INTO T-SQL bên dưới:
CHÈN VÀO CÁC GIÁ TRỊ TESTDB.dbo.FirstComTable ('AAA', 'BBB', 'CCC') ĐI 5 CHÈN VÀO TESTDB2.dbo.FirstComTable GIÁ TRỊ ('AAA', 'BBB', 'CCC') ĐI 5 CHÈN VÀO TESTDB .dbo.FirstComTable VALUES ('DDD', 'EEE', 'FFF') ĐI
Bây giờ, môi trường thử nghiệm đã sẵn sàng để bắt đầu mô tả các phương pháp so sánh dữ liệu và lược đồ.
So sánh dữ liệu bảng bằng cách sử dụng THAM GIA TRÁI
Từ khóa LEFT JOIN T-SQL được sử dụng để truy xuất dữ liệu từ hai bảng, bằng cách trả về tất cả các bản ghi từ bảng bên trái và chỉ các bản ghi được so khớp từ bảng bên phải và giá trị NULL từ bảng bên phải khi không có sự phù hợp nào giữa hai bảng.
Đối với mục đích so sánh dữ liệu, từ khóa LEFT JOIN có thể được sử dụng để so sánh hai bảng, dựa trên cột duy nhất chung, chẳng hạn như cột ID trong trường hợp của chúng tôi, như trong câu lệnh SELECT bên dưới:
CHỌN * TỪ TESTDB.dbo.FirstComTable FLEFT THAM GIA TESTDB2.dbo.FirstComTable SON F.ID =S.ID
Truy vấn trước đó sẽ trả về năm hàng phổ biến hiện có trong hai bảng, ngoài hàng tồn tại trong bảng đầu tiên và bị thiếu trong bảng thứ hai, bằng cách hiển thị giá trị NULL ở phía bên phải của kết quả, như được hiển thị bên dưới:
Bạn có thể dễ dàng suy ra từ kết quả trước đó rằng cột thứ sáu tồn tại trong bảng đầu tiên bị bỏ sót từ bảng thứ hai. Để đồng bộ hóa các hàng giữa các bảng, bạn cần chèn bản ghi mới vào bảng thứ hai theo cách thủ công. Phương thức LEFT JOIN hữu ích trong việc xác minh các hàng mới nhưng sẽ không hữu ích trong trường hợp cập nhật giá trị cột. Nếu bạn thay đổi giá trị cột Địa chỉ của hàng thứ 5, phương thức LEFT JOIN sẽ không phát hiện ra thay đổi đó như được hiển thị rõ ràng bên dưới:
So sánh dữ liệu bảng bằng mệnh đề EXCEPT
Câu lệnh EXCEPT trả về các hàng từ truy vấn đầu tiên (truy vấn bên trái) không được trả về từ truy vấn thứ hai (truy vấn bên phải). Nói cách khác, câu lệnh EXCEPT sẽ trả về sự khác biệt giữa hai câu lệnh hoặc bảng SELECT, giúp chúng ta dễ dàng so sánh dữ liệu trong các bảng này.
Câu lệnh EXCEPT có thể được sử dụng để so sánh dữ liệu trong các bảng đã tạo trước đó, bằng cách lấy sự khác biệt giữa truy vấn SELECT * từ bảng đầu tiên và truy vấn SELECT * từ bảng thứ hai, sử dụng các câu lệnh T-SQL bên dưới:
CHỌN * TỪ TESTDB.dbo.FirstComTable FEXCEPT CHỌN * TỪ TESTDB2.dbo. FirstComTable S
Kết quả của truy vấn trước đó sẽ là hàng có sẵn trong bảng đầu tiên và không có sẵn trong bảng thứ hai, như được hiển thị bên dưới:
Sử dụng câu lệnh EXCEPT để so sánh hai bảng tốt hơn câu lệnh LEFT JOIN ở chỗ, các bản ghi được cập nhật sẽ bị bắt trong kết quả chênh lệch dữ liệu. Giả sử rằng chúng tôi đã cập nhật Địa chỉ của hàng số 5 trong bảng thứ hai và kiểm tra sự khác biệt bằng cách sử dụng câu lệnh EXCEPT một lần nữa, bạn sẽ thấy rằng số hàng 5 sẽ được trả về với kết quả chênh lệch như được hiển thị bên dưới:
Bất lợi duy nhất của việc sử dụng câu lệnh EXCEPT để so sánh dữ liệu trong hai bảng là bạn cần phải đồng bộ hóa dữ liệu theo cách thủ công bằng cách viết câu lệnh INSERT cho các bản ghi bị thiếu trong bảng thứ hai. Hãy lưu ý rằng hai bảng được so sánh là bảng có khóa để có kết quả chính xác, với một khóa duy nhất được sử dụng để so sánh. Nếu chúng ta xóa cột duy nhất ID khỏi câu lệnh SELECT trong cả hai bên câu lệnh EXCEPT và liệt kê phần còn lại của các cột không phải khóa, như trong câu lệnh bên dưới:
CHỌN FirstName, LastName, Address FROM TESTDB.dbo. FirstComTable FEXCEPT CHỌN FirstName, LastName, Địa chỉ TỪ TESTDB2.dbo. FirstComTable S
Kết quả sẽ cho thấy rằng chỉ những bản ghi mới được trả về và những bản ghi đã cập nhật sẽ không được liệt kê, như thể hiện trong kết quả bên dưới:
So sánh dữ liệu bảng bằng UNION ALL… GROUP BY
Câu lệnh UNION ALL cũng có thể được sử dụng để so sánh dữ liệu trong hai bảng, dựa trên một cột khóa duy nhất. Để sử dụng câu lệnh UNION ALL để trả về sự khác biệt giữa hai bảng, bạn cần liệt kê các cột để so sánh trong câu lệnh SELECT và sử dụng các cột này trong mệnh đề GROUP BY, như được hiển thị trong truy vấn T-SQL bên dưới:
SELECT DISTINCT * FROM (SELECT * FROM (SELECT * FROM TESTDB.dbo. FirstComTable UNION ALL SELECT * FROM TESTDB2.dbo. FirstComTable) Tbls GROUP THEO ID, FirstName, LastName, Address HAVING COUNT (*) <2)
Và chỉ hàng tồn tại trong bảng đầu tiên và bị thiếu từ bảng thứ hai sẽ được trả lại như hình dưới đây:
Truy vấn trước đó cũng sẽ hoạt động tốt trong trường hợp cập nhật bản ghi nhưng theo một cách khác. Nó sẽ trả về các bản ghi mới được chèn ngoài các cột được cập nhật từ cả hai bảng, như trong trường hợp của hàng số 5, được hiển thị bên dưới:
So sánh dữ liệu bảng bằng công cụ dữ liệu SQL Server
Công cụ dữ liệu SQL Server, còn được gọi là SSDT, được xây dựng trên Microsoft Visual Studio có thể dễ dàng được sử dụng để so sánh dữ liệu trong hai bảng có cùng tên, dựa trên một cột khóa duy nhất, được lưu trữ trong hai cơ sở dữ liệu khác nhau và đồng bộ hóa dữ liệu trong các bảng này hoặc tạo một tập lệnh đồng bộ hóa để sử dụng sau này.
Từ cửa sổ SSDT đã mở, nhấp vào trình đơn Công cụ -> danh sách Máy chủ SQL và chọn So sánh dữ liệu mới tùy chọn, như được hiển thị bên dưới:
Trong cửa sổ kết nối được hiển thị, bạn có thể chọn từ các phiên đã kết nối trước đó hoặc điền vào cửa sổ Thuộc tính kết nối bằng tên Máy chủ SQL, thông tin xác thực và tên cơ sở dữ liệu, sau đó nhấp vào Kết nối , như hình dưới đây:
Trong trình hướng dẫn So sánh Dữ liệu Mới được hiển thị, chỉ định tên cơ sở dữ liệu nguồn và đích cũng như các tùy chọn so sánh được sử dụng trong quá trình so sánh bảng, sau đó nhấp vào Tiếp theo , như hình dưới đây:
Trong cửa sổ tiếp theo, hãy chỉ định tên của bảng, phải giống tên trong cơ sở dữ liệu nguồn và cơ sở dữ liệu đích, sẽ được so sánh trong cả hai cơ sở dữ liệu và nhấp vào Kết thúc , như bên dưới:
Kết quả được hiển thị sẽ cho bạn biết số lượng bản ghi được tìm thấy trong nguồn và bị bỏ sót từ đích, được tìm thấy trong đích và bị bỏ sót khỏi nguồn, số lượng bản ghi được cập nhật với cùng một khóa và các giá trị cột khác nhau (Bản ghi khác nhau) và cuối cùng là số lượng bản ghi giống hệt nhau được tìm thấy trong cả hai bảng, như được hiển thị bên dưới:
Nhấp vào tên bảng trong kết quả trước đó, bạn sẽ thấy một cái nhìn chi tiết về những phát hiện này, như hình dưới đây:
Bạn có thể sử dụng cùng một công cụ để tạo tập lệnh nhằm đồng bộ hóa bảng nguồn và bảng mục tiêu hoặc cập nhật bảng mục tiêu trực tiếp với các thay đổi bị thiếu hoặc khác, như bên dưới:
Nếu bạn nhấp vào tùy chọn Generate Script, một câu lệnh INSERT có cột bị thiếu trong bảng đích sẽ được hiển thị, như hình dưới đây:
BẮT ĐẦU GIAO DỊCH
BEGIN TRANSACTIONSET IDENTITY_INSERT [dbo]. [FirstComTable] ONINSERT INTO [dbo]. [FirstComTable] ([ID], [FirstName], [LastName], [Address]) GIÁ TRỊ (6, N'DDD ', N' EEE ', N'FFF') ĐẶT IDENTITY_INSERT [dbo]. [FirstComTable] GIAO DỊCH OFFCOMMIT
Việc chọn tùy chọn Mục tiêu Cập nhật trước tiên sẽ yêu cầu bạn xác nhận để thực hiện thay đổi, như trong thông báo bên dưới:
Sau khi đồng bộ hóa, bạn sẽ thấy rằng dữ liệu trong hai bảng sẽ giống hệt nhau, như hình dưới đây:
So sánh dữ liệu bảng bằng công cụ của bên thứ ba “dbForge Studio cho SQL Server”
Trong thế giới SQL Server, bạn có thể tìm thấy một số lượng lớn các công cụ của bên thứ ba giúp cuộc sống của quản trị viên và nhà phát triển cơ sở dữ liệu trở nên dễ dàng. Một trong những công cụ này, giúp cho các nhiệm vụ quản trị cơ sở dữ liệu trở thành một miếng bánh ngọt, là dbForge Studio dành cho SQL Server, cung cấp cho chúng ta những cách dễ dàng để thực hiện các tác vụ quản trị và phát triển cơ sở dữ liệu. Công cụ này cũng có thể giúp chúng tôi so sánh dữ liệu trong các bảng cơ sở dữ liệu và đồng bộ hóa các bảng này.
Từ trình đơn So sánh, chọn So sánh dữ liệu mới tùy chọn, như được hiển thị bên dưới:
Từ trình hướng dẫn So sánh Dữ liệu Mới, chỉ định cơ sở dữ liệu nguồn và đích, sau đó nhấp vào Tiếp theo :
Chọn các tùy chọn phù hợp từ nhiều tùy chọn so sánh và ánh xạ có sẵn và nhấp vào Tiếp theo :
Chỉ định tên của bảng hoặc các bảng sẽ tham gia vào quá trình so sánh dữ liệu. Trình hướng dẫn sẽ hiển thị thông báo cảnh báo trong trường hợp có bất kỳ sự khác biệt nào về lược đồ giữa các bảng cơ sở dữ liệu nguồn và cơ sở dữ liệu đích. Nhấp vào So sánh để tiếp tục:
Kết quả cuối cùng sẽ cho bạn thấy chi tiết, sự khác biệt về dữ liệu giữa bảng nguồn và bảng mục tiêu, với khả năng nhấp vào để đồng bộ hóa bảng nguồn và bảng đích, như được hiển thị bên dưới:
So sánh lược đồ các bảng bằng cách sử dụng sys.columns
Như đã đề cập ở phần đầu của bài viết này, để sao chép hoặc lưu trữ một bảng, bạn cần đảm bảo rằng lược đồ của bảng nguồn và bảng đích giống hệt nhau. SQL Server cung cấp cho chúng ta những cách khác nhau để so sánh lược đồ của các bảng trong cùng một cơ sở dữ liệu hoặc các cơ sở dữ liệu khác nhau. Phương pháp đầu tiên là truy vấn chế độ xem danh mục hệ thống sys.columns, trả về một hàng cho mỗi cột của đối tượng có một cột, với các thuộc tính của mỗi cột.
Để so sánh lược đồ của các bảng nằm trong các cơ sở dữ liệu khác nhau, bạn cần cung cấp sys.columns với tên bảng trong cơ sở dữ liệu hiện tại, mà không thể cung cấp bảng được lưu trữ trong cơ sở dữ liệu khác. Để đạt được điều đó, chúng tôi sẽ truy vấn sys.columns hai lần, lưu kết quả của mỗi truy vấn trong bảng tạm thời và cuối cùng so sánh kết quả của hai truy vấn này bằng lệnh EXCEPT T-SQL, như được hiển thị rõ ràng bên dưới:
SỬ DỤNG TESTDBSELECT tên, system_type_id, user_type_id, max_length, precision, scale, is_nullable, is_identity INTO #DBSchema FROM sys.columnsWHERE object_id =OBJECT_ID (N'dbo.FirstComTable ') GOUSE TestDB2GOSELECT_ name, system_type_id scale, is_nullable, is_identity INTO # DB2Schema FROM sys.columnsWHERE object_id =OBJECT_ID (N'dbo.FirstComTable '); ĐI CHỌN * TỪ #DBSchemaEXCEPT CHỌN * TỪ # DB2Schema
Kết quả sẽ cho chúng ta thấy rằng, định nghĩa cột Địa chỉ trong hai bảng này khác nhau, không có thông tin cụ thể về sự khác biệt chính xác, như được hiển thị bên dưới:
So sánh lược đồ các bảng bằng INFORMATION_SCHEMA.COLUMNS
Chế độ xem hệ thống INFORMATION_SCHEMA.COLUMNS cũng có thể được sử dụng để so sánh lược đồ của các bảng khác nhau, bằng cách cung cấp tên bảng. Một lần nữa, để so sánh hai bảng được lưu trữ trong các cơ sở dữ liệu khác nhau, chúng tôi sẽ truy vấn INFORMATION_SCHEMA.COLUMNS hai lần, giữ kết quả của mỗi truy vấn trong bảng tạm thời và cuối cùng so sánh kết quả của hai truy vấn này bằng lệnh EXCEPT T-SQL, như được minh họa rõ ràng bên dưới:
Và kết quả sẽ tương tự như phần trước, cho thấy định nghĩa cột Địa chỉ trong hai bảng này khác nhau, không có thông tin cụ thể về sự khác biệt chính xác, như hình dưới đây:
So sánh lược đồ các bảng bằng dm_exec_describe_first_result_set
Các lược đồ bảng cũng có thể được so sánh bằng cách truy vấn hàm quản lý động dm_exec_describe_first_result_set, sử dụng câu lệnh Transact-SQL làm tham số và mô tả siêu dữ liệu của tập kết quả đầu tiên cho câu lệnh.
Để so sánh lược đồ của hai bảng, bạn cần tham gia dm_exec_describe_first_result_set DMF với chính nó, cung cấp câu lệnh SELECT từ mỗi bảng dưới dạng tham số, như trong truy vấn T-SQL bên dưới:
CHỌN FT.name, ST.name, FT.system_type_name, ST.system_type_name, FT.max_length, ST.max_length, FT.pre khít, ST.pre chính xác, 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) FTLEFT OUTER JOIN sys.dm_exec_describe_first_result_set' Test NULL, NULL'S , 0) STON FT.Name =ST.NameGOKết quả lần này sẽ rõ ràng hơn, vì bạn có thể so sánh bằng mắt, sự khác biệt giữa hai bảng, đó là kích thước và kiểu của cột Địa chỉ, như được hiển thị bên dưới:
So sánh lược đồ các bảng bằng cách sử dụng công cụ dữ liệu máy chủ SQL
Công cụ Dữ liệu SQL Server cũng có thể được sử dụng để so sánh lược đồ của các bảng nằm trong các cơ sở dữ liệu khác nhau. Trong trình đơn Công cụ, chọn So sánh giản đồ mới từ danh sách tùy chọn SQL Server, như được hiển thị bên dưới:
Sau khi cung cấp các thông số kết nối, nhấp vào nút So sánh:
Cụ thể, kết quả so sánh sẽ cho bạn thấy sự khác biệt về giản đồ giữa hai bảng trong hình dạng của các lệnh T-SQL TẠO BẢNG, được tô bóng như trong ảnh chụp nhanh bên dưới:
Bạn có thể dễ dàng nhấp vào để đồng bộ hóa giản đồ bảng hoặc nhấp vào để viết kịch bản cho thay đổi và thực hiện sau, như được hiển thị bên dưới:
So sánh lược đồ các bảng bằng cách sử dụng dbForge Studio cho Công cụ bên thứ ba của SQL Server
Công cụ dbForge Studio cho SQL Server cung cấp cho chúng tôi khả năng so sánh lược đồ của các bảng cơ sở dữ liệu khác nhau. Từ trình đơn So sánh, hãy chọn So sánh giản đồ mới tùy chọn, như bên dưới:
Sau khi chỉ định các thuộc tính kết nối của cả cơ sở dữ liệu nguồn và cơ sở dữ liệu đích, hãy chọn tùy chọn ánh xạ phù hợp, từ các lựa chọn có sẵn và nhấp vào Tiếp theo :
Chọn các lược đồ mà bạn sẽ so sánh đối tượng của nó và nhấp vào Tiếp theo :
Chỉ định bảng hoặc các bảng sẽ tham gia vào quá trình so sánh giản đồ và nhấp vào So sánh , nếu bạn muốn bỏ qua việc thay đổi cài đặt mặc định trong cửa sổ Bộ lọc Đối tượng, như bên dưới:
Kết quả so sánh được hiển thị sẽ cho bạn thấy sự khác biệt giữa lược đồ hai bảng, bằng cách đánh dấu chính xác phần của kiểu dữ liệu khác nhau giữa hai cột, với khả năng chỉ định hành động cần thực hiện để đồng bộ hóa hai bảng, như được hiển thị bên dưới :
Nếu bạn sắp xếp để đồng bộ hóa lược đồ của hai bảng, hãy nhấp vào nút và chỉ định trong trình hướng dẫn Đồng bộ hóa lược đồ nếu bạn quản lý để thực hiện thay đổi trực tiếp trên bảng đích hoặc chỉ tập lệnh cho nó sẽ được sử dụng trong tương lai, như bên dưới:
Liên kết hữu ích:
- Đặt toán tử - EXCEPT và INTERSECT (Transact-SQL)
- Đặt toán tử - UNION (Transact-SQL)
- Tải xuống Công cụ Dữ liệu Máy chủ SQL (SSDT)
- So sánh và đồng bộ hóa dữ liệu trong một hoặc nhiều bảng với dữ liệu trong cơ sở dữ liệu tham chiếu
- sys.dm_exec_describe_first_result_set (Transact-SQL)
- sys.columns (Transact-SQL)
- Chế độ xem giản đồ thông tin hệ thống (Transact-SQL)
Các công cụ hữu ích:
dbForge Schema Compare for SQL Server - công cụ đáng tin cậy giúp tiết kiệm thời gian và công sức của bạn khi so sánh và đồng bộ hóa cơ sở dữ liệu trên SQL Server.
dbForge Data Compare dành cho SQL Server - công cụ so sánh SQL mạnh mẽ có khả năng làm việc với dữ liệu lớn.