Przedstawiam rozwinięcie skryptu „Informacje o tabelach, ilościach wierszy i wielkościach danych zawartych w bazie danych.” przydatnego przy porównywaniu nazw tabel i ilości rekordów w bazach danych umieszczonych na różnych serwerach. Niżej przedstawiony skrypt uruchamiamy na serwerze źródłowym, wynikiem którego jest wygenerowany automatycznie skrypt służący do uruchomienia na serwerze docelowym.

Wynikiem tego skryptu będzie tabela przedstawiająca różnice w występowaniu tabel czy też różnej ilości rekordów w bazie danych.

Testowany na SQL Server 2000, 2008.

/* Author Dariusz 'DBSoft' Brejnak (c) 2010
name        rows Database
publishers1    8 Source -- inna nazwa tabeli lub brak w destination
titles        28 Source   -- inna ilość rekordów
publishers     8 Destination -- inna nazwa tabeli lub brak w source
sales         21 Destination -- brak tabeli w source
titles        18 Destination -- inna ilość rekordów
*/

SET NOCOUNT ON
CREATE TABLE #tmp
([name] varchar(50),
[rows] int,
[reserved] varchar (20),
[data] varchar (20),
[index_size] varchar(20),
[unsed] varchar(20)
)
CREATE TABLE #tmprows_source
([servername] varchar(50),
[basename] varchar(50),
[name] varchar(50),
[rows] int,
[reserved] varchar (20),
[data] varchar (20),
[index_size] varchar(20),
[unsed] varchar(20)
)
INSERT #tmp EXEC sp_MSforeachtable 'exec sp_spaceused ''?'''

INSERT #tmprows_source
SELECT @@SERVERNAME,
DB_NAME(),
[name],
[rows],
replace(reserved,'KB',''),
replace(data,'KB',''),
replace(index_size,'KB',''),
replace(unsed,'KB','')
FROM #tmp

SELECT [servername],
[basename],
[name],
[rows],
[reserved],
[data],
[index_size],
[unsed]
FROM #tmprows_source
ORDER BY [name]

PRINT '/*
Script : CompareTablesInDatabase.sql
Author : Dariusz ''DBSoft'' Brejnak (c) 2010
generated automatically on  '+@@SERVERNAME+'*/'
PRINT
'CREATE TABLE #tmprows_source
([servername] varchar(50),
[basename] varchar(50),
[name] varchar(50),
[rows] int,
[reserved] varchar (20),
[data] varchar (20),
[index_size]varchar(20),
[unsed] varchar(20)
)'
PRINT ''
DECLARE @servername varchar(50),
@basename varchar(50),
@name varchar(50),
@rows int,
@reserved int,
@data int,
@index_size int,
@unused int

DECLARE DB_Cursor CURSOR FOR
SELECT [servername],
[basename],
[name],
[rows],
[reserved],
[data],
[index_size],
[unsed]
FROM #tmprows_source

OPEN DB_Cursor
FETCH NEXT FROM DB_Cursor
INTO @servername,@basename,@name,@rows,@reserved,

@data,@index_size,@unused

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'INSERT INTO #tmprows_source VALUES ('''+@servername+''','+
''''+@basename+''','+
''''+@name+''','+
cast(@rows as varchar(10))+','+
cast(@reserved as varchar(10))+','+
cast(@data as varchar(10))+','+
cast(@index_size as varchar(10))+','+
cast(@unused as varchar(10))+
+')'
FETCH NEXT FROM DB_Cursor
INTO @servername,@basename,@name,@rows,@reserved,

@data,@index_size,@unused
END

CLOSE DB_Cursor
DEALLOCATE DB_Cursor

PRINT ''
PRINT 'CREATE TABLE #tmp
([name] varchar(50),
[rows] int,
[reserved] varchar (20),
[data] varchar (20),
[index_size]varchar(20),
[unsed] varchar(20)
)
CREATE TABLE #tmprows_destination
([servername] varchar(50),
[basename] varchar(50),
[name] varchar(50),
[rows] int,
[reserved] varchar (20),
[data] varchar (20),
[index_size]varchar(20),
[unsed] varchar(20)
)'

PRINT 'INSERT #tmp EXEC sp_MSforeachtable ''exec sp_spaceused ''''?'''''''

PRINT 'INSERT #tmprows_destination
SELECT @@SERVERNAME,
DB_NAME(),
[name],
[rows],
replace(reserved,''KB'',''''),
replace(data,''KB'',''''),
replace(index_size,''KB'',''''),
replace(unsed,''KB'','''')
FROM #tmp'

PRINT '
SELECT [name], [rows],''Source'' as ''Database''
FROM  #tmprows_source
EXCEPT
SELECT [name], [rows],''Source'' as ''Database''
FROM #tmprows_destination
UNION ALL
SELECT [name], [rows],''Destination'' as ''Database''
FROM #tmprows_destination
EXCEPT
SELECT [name], [rows],''Destination'' as ''Database''
FROM #tmprows_source

DROP TABLE #tmp
DROP TABLE #tmprows_source
DROP TABLE #tmprows_destination'
DROP TABLE #tmp
DROP TABLE #tmprows_source

.


Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl