Środowisko SQL Server kryje wiele ciekawych programów, jednym z nich jest TableDiff.exe
Standardowa ścieżka to C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe
Dzięki temu programowi możemy w bardzo szybki sposób porównać dane w dwóch tabelach, które mogą być na niepołączonych ze sobą serwerach. Na wyjściu możemy otrzymać skrypt SQL do „wyrównania” danych, szybkie wyniki statystyczne lub informacje w tabeli.
Tworzymy sobie tabelę
USE test
GO
CREATE TABLE test_diff (id INT IDENTITY(1,1) PRIMARY KEY,
tekst VARCHAR(100))
GO
INSERT test_diff
SELECT NEWID()
GO 10000
Tworzymy tabelkę do porównania i zmieniamy trochę dane w pierwszej
CREATE TABLE test_diff2 (id INT IDENTITY(1,1) PRIMARY KEY,
tekst VARCHAR(100))
GO
INSERT test_diff2
SELECT tekst FROM test_diff
GO
INSERT test_diff
SELECT NEWID()
GO 100
UPDATE test_diff
SET tekst =NEWID()
WHERE id BETWEEN 138 AND 238
W konsoli CMD wpisujemy
"C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe"
-sourceserver "KOMPUTER\ROKU" -sourcedatabase "test" -sourceschema "dbo" -sour
cetable "test_diff" -destinationserver "KOMPUTER\ROKU" -destinationdatabase "te
st" -destinationschema "dbo" -destinationtable "test_diff2" -dt -f "C:\Users\rku
balski\Desktop\test.sql"
Enter i mamy wynik
Microsoft (R) SQL Server Replication Diff Tool
Copyright (c) 2008 Microsoft Corporation
User-specified agent parameter values:
-sourceserver KOMPUTER\ROKU
-sourcedatabase test
-sourceschema dbo
-sourcetable test_diff
-destinationserver KOMPUTER\ROKU
-destinationdatabase test
-destinationschema dbo
-destinationtable test_diff2
-dt
-f C:\Users\rkubalski\Desktop\test.sql
Table [test].[dbo].[test_diff] on KOMPUTER\ROKU and Table [test].[dbo].[test_di
ff2] on KOMPUTER\ROKU have 201 differences.
Fix SQL written to C:\Users\rkubalski\Desktop\test.sql.
Mismatch 138 tekst
<ciach>
Mismatch 238 tekst
Src. Only 10001
<ciach>
Src. Only 10100
The requested operation took 0,4190239 seconds.
0,4 sekundy to dobry czas , przy wyszukiwaniu w tabelach mających po kilka milionów rekordów czasy są rewelacyjne.
W wyniku działania programu dostaliśmy plik test.sql
-- Host: KOMPUTER\ROKU
-- Database: [test]
-- Table: [dbo].[test_diff2]
SET IDENTITY_INSERT [dbo].[test_diff2] ON
UPDATE [dbo].[test_diff2] SET [tekst]=N'FC138198-9D17-4103-8E88-322423BDAB4D' WHERE [id] = 138
<ciach>
UPDATE [dbo].[test_diff2] SET [tekst]=N'902A840C-72CE-4523-8130-A75C92CC069E' WHERE [id] = 238
INSERT INTO [dbo].[test_diff2] ([id],[tekst]) VALUES (10001,N'C6D720B8-8FC4-4DEF-B16D-98EB8729C79C')
<ciach>
INSERT INTO [dbo].[test_diff2] ([id],[tekst]) VALUES (10100,N'C902165D-E386-4266-BDD8-2D0C3EA3C8F6')
SET IDENTITY_INSERT [dbo].[test_diff2] OFF
Pełna składnia programu
tablediff
[ -? ] |
{
-sourceserversource_server_name[\instance_name]
-sourcedatabasesource_database-sourcetablesource_table_name
[ -sourceschemasource_schema_name ]
[ -sourcepasswordsource_password ]
[ -sourceusersource_login ]
[ -sourcelocked ]
-destinationserverdestination_server_name[\instance_name]
-destinationdatabasesubscription_database-destinationtabledestination_table
[ -destinationschemadestination_schema_name ]
[ -destinationpassworddestination_password ]
[ -destinationuserdestination_login ]
[ -destinationlocked ]
[ -blarge_object_bytes ]
[ -bfnumber_of_statements ]
[ -c ]
[ -dt ]
[ -ettable_name ]
[ -f [ file_name ] ]
[ -ooutput_file_name ]
[ -q ]
[ -rcnumber_of_retries ]
[ -riretry_interval ]
[ -strict ]
[ -tconnection_timeouts ]
}