-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathTsqlTools-SQLcompare-ObjectsCompare.sql
More file actions
133 lines (103 loc) · 4.85 KB
/
TsqlTools-SQLcompare-ObjectsCompare.sql
File metadata and controls
133 lines (103 loc) · 4.85 KB
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
/*****************************************************************
-----------------------
tsqltools - SQLCOMPARE - Objects Compare
-----------------------
Version: v1.0
Release Date: 2017-07-30
Author: Bhuvanesh(@SQLadmin)
Feedback: mailto:r.bhuvanesh@outlook.com
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 necessary variables
DECLARE @SourceDbServer NVARCHAR(100) = '[db01]'; -- Replace with your source DB server name
DECLARE @DestinationDbServer NVARCHAR(100) = '[db02]'; -- Replace with your target DB server name
DECLARE @SourceDbNameQuery NVARCHAR(MAX);
DECLARE @SourceDbName NVARCHAR(100);
-- Declare table variable to store source database names
DECLARE @SourceDatabases TABLE (DbName NVARCHAR(100));
-- Populate source database names
SET @SourceDbNameQuery = N'SELECT name FROM ' + @SourceDbServer + '.master.sys.databases WHERE database_id > 4';
INSERT INTO @SourceDatabases
EXEC sp_executesql @SourceDbNameQuery;
-- Temporary table to store object status
CREATE TABLE #ObjectStatus (
DbName NVARCHAR(500),
ObjectName NVARCHAR(500),
ObjectType NVARCHAR(500),
Status NVARCHAR(500)
);
-- Cursor to iterate through source databases
DECLARE dbCursor CURSOR FOR
SELECT DbName FROM @SourceDatabases;
OPEN dbCursor;
FETCH NEXT FROM dbCursor INTO @SourceDbName;
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @SourceDbFullName NVARCHAR(500);
DECLARE @DestinationDbFullName NVARCHAR(500);
DECLARE @Sql NVARCHAR(MAX);
-- Construct full database names
SET @SourceDbFullName = @SourceDbServer + '.' + @SourceDbName;
SET @DestinationDbFullName = @DestinationDbServer + '.' + @SourceDbName;
-- Construct SQL query to compare objects between source and destination databases
SET @Sql = N'
SELECT ''' + @SourceDbName + ''' AS DbName,
ISNULL(SoSource.name, SoDestination.name) AS ObjectName,
COALESCE(SoSource.type_desc, SoDestination.type_desc) AS ObjectType,
CASE
WHEN SoSource.object_id IS NULL THEN ''Available on ' + @DestinationDbFullName + '''
WHEN SoDestination.object_id IS NULL THEN ''Available on ' + @SourceDbFullName + '''
ELSE ''Available on Both Servers''
END AS Status
FROM ' + @SourceDbFullName + '.sys.objects SoSource
FULL OUTER JOIN ' + @DestinationDbFullName + '.sys.objects SoDestination
ON SoSource.name = SoDestination.name COLLATE database_default
AND SoSource.type = SoDestination.type COLLATE database_default
WHERE COALESCE(SoSource.type_desc, SoDestination.type_desc) NOT IN (''INTERNAL_TABLE'', ''SYSTEM_TABLE'', ''SERVICE_QUEUE'')
ORDER BY COALESCE(SoSource.type_desc, SoDestination.type_desc)';
-- Execute SQL query and insert results into temporary table
INSERT INTO #ObjectStatus
EXEC sp_executesql @Sql;
FETCH NEXT FROM dbCursor INTO @SourceDbName;
END;
CLOSE dbCursor;
DEALLOCATE dbCursor;
-- Query to select and order objects by type
SELECT * FROM #ObjectStatus WHERE ObjectType = 'USER_TABLE' ORDER BY DbName ASC;
SELECT * FROM #ObjectStatus WHERE ObjectType = 'CHECK_CONSTRAINT' ORDER BY DbName ASC;
SELECT * FROM #ObjectStatus WHERE ObjectType = 'DEFAULT_CONSTRAINT' ORDER BY DbName ASC;
SELECT * FROM #ObjectStatus WHERE ObjectType = 'FOREIGN_KEY_CONSTRAINT' ORDER BY DbName ASC;
SELECT * FROM #ObjectStatus WHERE ObjectType = 'PRIMARY_KEY_CONSTRAINT' ORDER BY DbName ASC;
SELECT * FROM #ObjectStatus WHERE ObjectType = 'UNIQUE_CONSTRAINT' ORDER BY DbName ASC;
SELECT * FROM #ObjectStatus WHERE ObjectType = 'SQL_TRIGGER' ORDER BY DbName ASC;
SELECT * FROM #ObjectStatus WHERE ObjectType = 'VIEW' ORDER BY DbName ASC;
SELECT * FROM #ObjectStatus WHERE ObjectType = 'SQL_STORED_PROCEDURE' ORDER BY DbName ASC;
-- Select remaining object types not listed above
SELECT * FROM #ObjectStatus
WHERE ObjectType NOT IN (
'USER_TABLE',
'CHECK_CONSTRAINT',
'DEFAULT_CONSTRAINT',
'FOREIGN_KEY_CONSTRAINT',
'PRIMARY_KEY_CONSTRAINT',
'UNIQUE_CONSTRAINT',
'SQL_TRIGGER',
'VIEW',
'SQL_STORED_PROCEDURE'
)
ORDER BY DbName ASC;
-- Clean up temporary table
DROP TABLE #ObjectStatus;