-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathTsqlTools-SQLcompare-IndexCompare.sql
173 lines (135 loc) · 4.61 KB
/
TsqlTools-SQLcompare-IndexCompare.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/*****************************************************************
-----------------------
tsqltools - SQLCOMPARE - Index Compare
-----------------------
Version: v1.0
Release Date: 2017-07-30
Author: Bhuvanesh(@SQLadmin)
Feedback: mailto:[email protected]
Updates: http://medium.com/sqladmin
Repo: https://github.com/SqlAdmin/tsqltools/
License:
tsqltools is free to download.It contains Tsql stored procedures
and scripts to help the DBAs and Developers to make their job easier
(C) 2017
======================================================================
What is TsqlTools-SQLcompare?
TsqlTools-SQLcompare is a tsqlscript that will help to compare Databases,
Tables, Objects, Indexices between two servers without any tools.
======================================================================
How to Start?
Use a centalized server and create LinkedServers from the centralized server.
Or Create LinkedServer on SourceDB server then run this query on SourceDB server.
========================================================================*/
DECLARE @SOURCEDBSERVER varchar(100)
DECLARE @DESTINATIONDBSERVER varchar(100)
DECLARE @SOURCE_SQL_DBNAME nvarchar(300)
DECLARE @SOURCE_DATABASENAME TABLE ( dbname varchar(100))
DECLARE @DESTINATION_SQL_DBNAME nvarchar(300)
DECLARE @DESTINATION_DATABASENAME TABLE ( dbname varchar(100))
SELECT @SOURCEDBSERVER = '[db01]' --==> Replace Your Source DB serverName Here
SELECT @DESTINATIONDBSERVER = '[db02]' --==> Replace Your Target DB serverName Here
SELECT
@SOURCE_SQL_DBNAME = 'select name from ' + @SOURCEDBSERVER + '.master.sys.databases where database_id>4'
INSERT INTO @SOURCE_DATABASENAME EXEC sp_executesql @SOURCE_SQL_DBNAME
SELECT
@DESTINATION_SQL_DBNAME = 'select name from ' + @DESTINATIONDBSERVER + '.master.sys.databases where database_id>4'
INSERT INTO @DESTINATION_DATABASENAME EXEC sp_executesql @DESTINATION_SQL_DBNAME
CREATE TABLE #SOURCEDB_INDEX (
DB nvarchar(100),
TableName nvarchar(500),
IndexName varchar(300),
Type varchar(100)
)
CREATE TABLE #DESTINATIONDB_INDEX (
DB nvarchar(100),
TableName nvarchar(500),
IndexName varchar(300),
Type varchar(100)
)
DECLARE dbcursor CURSOR FOR
SELECT
dbname
FROM @SOURCE_DATABASENAME
OPEN dbcursor
DECLARE @Source_DBname varchar(100)
FETCH NEXT FROM dbcursor INTO @Source_DBNAME
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @SOURCE_SQL nvarchar(max)
SELECT
@SOURCE_SQL ='
insert into #SOURCEDB_INDEX SELECT ' + '''' + @Source_DBname + '''' + ',
so.name AS TableName,
si.name AS IndexName,
si.type_desc AS IndexType
FROM ' + @SOURCEDBSERVER + '.' + @Source_DBname + '.sys.indexes si
JOIN ' + @SOURCEDBSERVER + '.' + @Source_DBname + '.sys.objects so
ON si.[object_id] = so.[object_id]
WHERE
so.type = ' + '''U''' + '
AND si.name IS NOT NULL ORDER BY
so.name, si.type
'
EXEC sp_executesql @SOURCE_SQL
FETCH NEXT FROM dbcursor INTO @Source_DBname
END
CLOSE dbcursor
DEALLOCATE dbcursor
DECLARE dbcursor CURSOR FOR
SELECT
dbname
FROM @DESTINATION_DATABASENAME
OPEN dbcursor
DECLARE @DESTINATION_DBname varchar(100)
FETCH NEXT FROM dbcursor INTO @DESTINATION_DBNAME
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @DESTINATION_SQL nvarchar(max)
SELECT
@DESTINATION_SQL ='
insert into #DESTINATIONDB_INDEX SELECT ' + '''' + @DESTINATION_DBname + '''' + ',
so.name AS TableName,
si.name AS IndexName,
si.type_desc AS IndexType
FROM ' + @DESTINATIONDBSERVER + '.' + @DESTINATION_DBname + '.sys.indexes si
JOIN ' + @DESTINATIONDBSERVER + '.' + @DESTINATION_DBname + '.sys.objects so
ON si.[object_id] = so.[object_id]
WHERE
so.type = ' + '''U''' + '
AND si.name IS NOT NULL ORDER BY
so.name, si.type '
EXEC sp_executesql @DESTINATION_SQL
FETCH NEXT FROM dbcursor INTO @DESTINATION_DBname
END
CLOSE dbcursor
DEALLOCATE dbcursor
;
WITH cte
AS (SELECT
DB,
TableName,
IndexName,
HASHBYTES('sha1', concat(DB, TableName, IndexName)) AS tb1
FROM #SOURCEDB_INDEX)
SELECT
ISNULL(c.DB, b.DB) AS DB,
ISNULL(c.TableName, b.TableName) AS TableName,
ISNULL(c.IndexName, b.IndexName) AS IndexName,
CASE
WHEN c.tb1 IS NULL THEN 'Available On ' + @DESTINATIONDBSERVER + ' Only'
WHEN c.tb1 IS NOT NULL AND
b.tb1 IS NOT NULL THEN 'Available On Both Servers'
WHEN b.tb1 IS NULL THEN 'Available On ' + @SOURCEDBSERVER + ' Only'
END AS 'Status'
FROM cte c
FULL JOIN (SELECT
DB,
TableName,
IndexName,
HASHBYTES('sha1', concat(DB, TableName, IndexName)) AS tb1
FROM #DESTINATIONDB_INDEX) b
ON b.tb1 = c.tb1
ORDER BY tablename
DROP TABLE #SOURCEDB_INDEX
DROP TABLE #DESTINATIONDB_INDEX