środa, 9 marca 2011

TableDiff

Ś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.
Err     id      Col
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 ]
}

Brak komentarzy:

Prześlij komentarz