Saturday 20 July 2013

Exploring SQL Server table metadata with SSMS and TSQL

Exploring SQL Server table metadata with SSMS and TSQL Good LINK on Playing with SQL SERVER METADATA TABLES
https://www.simple-talk.com/sql/t-sql-programming/exploring-sql-server-table-metadata-with-ssms-and-tsql/

Monday 1 July 2013

GENERIC 18. Drop Procs and UDFs which are not there in Later versions

USE [DBName1]
GO
-- Drop Procs and UDFs which are not there in Later versions
SELECT 'USE [DBName2]'
UNION ALL
SELECT 'GO'
UNION ALL
SELECT '-- Drop Procs and UDFs which are not there in Later versions '
UNION ALL
SELECT --ROUTINE_SCHEMA,ROUTINE_NAME,ROUTINE_TYPE
'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''['+ROUTINE_SCHEMA+'].['+ROUTINE_NAME+']'') AND type in (N''P'', N''PC'',''FN'', N''IF'', N''TF'', N''FS'', N''FT'')) DROP '+ ROUTINE_TYPE +' ['+ROUTINE_SCHEMA+'].['+ROUTINE_NAME + '] '+ ' GO'
FROM DBName2 .INFORMATION_SCHEMA.ROUTINES A
WHERE ROUTINE_NAME NOT IN (
SELECT ROUTINE_NAME COLLATE Latin1_General_CI_AI FROM [DBName1].INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA COLLATE Latin1_General_CI_AI= A.ROUTINE_SCHEMA AND ROUTINE_NAME COLLATE Latin1_General_CI_AI= A.ROUTINE_NAME AND ROUTINE_TYPE COLLATE Latin1_General_CI_AI= A.ROUTINE_TYPE)
UNION ALL
SELECT 'GO'
GO

GENERIC 17. Create Indexes which are not there in earlier version

USE [DBName1]
GO
--Create script to identify new Indexes which are not there in earlier Version
SELECT 'USE [DBName2]'
UNION ALL
SELECT 'GO'
UNION ALL
SELECT '--Create Indexes which are not there in earlier Version '
UNION ALL
SELECT --IS_UNIQUE_CONSTRAINT,IS_PRIMARY_KEY,is_unique,TYPE_DESC,
'IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N''['+A.TABLE_SCHEMA+'].'+A.TABLE_NAME+''') AND name = N'''+A.INDEX_NAME+''') DROP INDEX ['+ INDEX_NAME +'] ON ['+A.TABLE_SCHEMA+'].['+ A.TABLE_NAME +'] WITH ( ONLINE = OFF )'+
CASE WHEN IS_UNIQUE = 1 THEN
';WITH CTE_Dup AS ( SELECT *, ROW_NUMBER()OVER ( PARTITION BY ' + + KEY_COLUMNS + ' ORDER BY ' + KEY_COLUMNS + ' ) AS ROW_NO FROM ['+TABLE_SCHEMA+'].['+ TABLE_NAME +'] ) DELETE FROM CTE_Dup WHERE ROW_NO > 1; CREATE UNIQUE NONCLUSTERED INDEX ' ELSE
' CREATE NONCLUSTERED INDEX ' END + ' ['+ INDEX_NAME +'] ON ['+A.TABLE_SCHEMA+'].['+ A.TABLE_NAME +'] ( '
+
A.KEY_COLUMNS
+
' )'+ CASE WHEN A.INCLUDE_COLUMNS IS NOT NULL THEN 'INCLUDE ( ' + A.INCLUDE_COLUMNS + ') ' ELSE '' END +
' WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO'
FROM
(
SELECT DISTINCT A.name AS TABLE_NAME,B.name AS INDEX_NAME,SCHEMA_NAME(A.schema_id) AS TABLE_SCHEMA
,SUBSTRING((
SELECT ', ' + AC.name
FROM [DBName1].SYS.TABLES AS T
INNER JOIN [DBName1].SYS.INDEXES I ON T.object_id = I.object_id
INNER JOIN [DBName1].SYS.INDEX_COLUMNS IC ON I.object_id = IC.object_id AND I.index_id = IC.index_id
INNER JOIN [DBName1].SYS.ALL_COLUMNS AC ON T.object_id = AC.object_id AND IC.column_id = AC.column_id
WHERE B.object_id = I.object_id AND B.index_id = I.index_id AND IC.is_included_column = 0
ORDER BY IC.key_ordinal FOR XML PATH('')), 2, 8000) AS KEY_COLUMNS
,SUBSTRING((
SELECT ', ' + AC.name
FROM [DBName1].SYS.TABLES AS T
INNER JOIN [DBName1].SYS.INDEXES I ON T.object_id = I.object_id
INNER JOIN [DBName1].SYS.INDEX_COLUMNS IC ON I.object_id = IC.object_id AND I.index_id = IC.index_id
INNER JOIN [DBName1].SYS.ALL_COLUMNS AC ON T.object_id = AC.object_id AND IC.column_id = AC.column_id
WHERE B.object_id = I.object_id AND B.index_id = I.index_id AND IC.is_included_column = 1
ORDER BY IC.key_ordinal FOR XML PATH('') ), 2, 8000) AS INCLUDE_COLUMNS
,B.TYPE_DESC ,B.IS_PRIMARY_KEY,B.IS_UNIQUE_CONSTRAINT,B.is_unique
FROM [DBName1].SYS.TABLES A
JOIN [DBName1].SYS.INDEXES B ON A.object_id = B.object_id -- AND B.name = 'IX_tCloseTripsJob_PlayerId'
JOIN [DBName1].SYS.INDEX_COLUMNS C ON C.object_id = A.object_id AND B.index_id = C.index_id
JOIN [DBName1].SYS.ALL_COLUMNS AC ON AC.object_id = A.object_id AND AC.column_id = C.column_id
WHERE A.name NOT LIKE 'SYS%'
AND B.NAME NOT IN ( SELECT DISTINCT D.name COLLATE SQL_Latin1_General_CP1_CI_AS FROM DBName2.SYS.tables C JOIN DBName2.SYS.indexes D ON C.object_id =D.object_id WHERE C.name COLLATE SQL_Latin1_General_CP1_CI_AS = A.name )
--AND B.type_desc = 'NONCLUSTERED'
) A
UNION ALL
SELECT 'GO '
UNION ALL
SELECT --IS_UNIQUE_CONSTRAINT,IS_PRIMARY_KEY,is_unique,TYPE_DESC,
'IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N''['+A.TABLE_SCHEMA+'].'+A.TABLE_NAME+''') AND name = N'''+A.INDEX_NAME+''') DROP INDEX ['+ INDEX_NAME +'] ON ['+A.TABLE_SCHEMA+'].['+ A.TABLE_NAME +'] WITH ( ONLINE = OFF )'+
CASE WHEN IS_UNIQUE = 1 THEN
';WITH CTE_Dup AS ( SELECT *, ROW_NUMBER()OVER ( PARTITION BY ' + + KEY_COLUMNS + ' ORDER BY ' + KEY_COLUMNS + ' ) AS ROW_NO FROM ['+TABLE_SCHEMA+'].['+ TABLE_NAME +'] ) DELETE FROM CTE_Dup WHERE ROW_NO > 1; CREATE UNIQUE NONCLUSTERED INDEX ' ELSE
' CREATE NONCLUSTERED INDEX ' END + ' ['+ INDEX_NAME +'] ON ['+A.TABLE_SCHEMA+'].['+ A.TABLE_NAME +'] ( '
+
A.KEY_COLUMNS
+
' )'+ CASE WHEN A.INCLUDE_COLUMNS IS NOT NULL THEN 'INCLUDE ( ' + A.INCLUDE_COLUMNS + ') ' ELSE '' END +
' WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO'
FROM
(
SELECT DISTINCT A.name AS TABLE_NAME,B.name AS INDEX_NAME,SCHEMA_NAME(A.schema_id) AS TABLE_SCHEMA
,SUBSTRING((
SELECT ', ' + AC.name
FROM [DBName1].SYS.TABLES AS T
INNER JOIN [DBName1].SYS.INDEXES I ON T.object_id = I.object_id
INNER JOIN [DBName1].SYS.INDEX_COLUMNS IC ON I.object_id = IC.object_id AND I.index_id = IC.index_id
INNER JOIN [DBName1].SYS.ALL_COLUMNS AC ON T.object_id = AC.object_id AND IC.column_id = AC.column_id
WHERE B.object_id = I.object_id AND B.index_id = I.index_id AND IC.is_included_column = 0
ORDER BY IC.key_ordinal FOR XML PATH('')), 2, 8000) AS KEY_COLUMNS
,SUBSTRING((
SELECT ', ' + AC.name
FROM [DBName1].SYS.TABLES AS T
INNER JOIN [DBName1].SYS.INDEXES I ON T.object_id = I.object_id
INNER JOIN [DBName1].SYS.INDEX_COLUMNS IC ON I.object_id = IC.object_id AND I.index_id = IC.index_id
INNER JOIN [DBName1].SYS.ALL_COLUMNS AC ON T.object_id = AC.object_id AND IC.column_id = AC.column_id
WHERE B.object_id = I.object_id AND B.index_id = I.index_id AND IC.is_included_column = 1
ORDER BY IC.key_ordinal FOR XML PATH('') ), 2, 8000) AS INCLUDE_COLUMNS
,B.TYPE_DESC ,B.IS_PRIMARY_KEY,B.IS_UNIQUE_CONSTRAINT,B.is_unique
FROM [DBName1].SYS.TABLES A
JOIN [DBName1].SYS.INDEXES B ON A.object_id = B.object_id
JOIN [DBName1].SYS.INDEX_COLUMNS C ON C.object_id = A.object_id AND B.index_id = C.index_id
JOIN [DBName1].SYS.ALL_COLUMNS AC ON AC.object_id = A.object_id AND AC.column_id = C.column_id
JOIN DBName2.SYS.indexes I ON B.name = I.name COLLATE SQL_Latin1_General_CP1_CI_AS
JOIN DBName2.SYS.tables T ON I.object_id =T.object_id
WHERE A.name NOT LIKE 'SYS%'
--AND B.NAME IN ( SELECT DISTINCT D.name COLLATE SQL_Latin1_General_CP1_CI_AS FROM DBName2.SYS.tables C JOIN DBName2.SYS.indexes D ON C.object_id =D.object_id WHERE C.name COLLATE SQL_Latin1_General_CP1_CI_AS = A.name )
AND I.is_unique <> B.is_unique
--AND B.type_desc = 'NONCLUSTERED'
) A

GENERIC 16. Create Remaining Default constraints & missed columns

--IDENTIFY NEW CONSTRAINTS HAS BEEN CREATED IN LATER VERSION
USE [DBName1]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IamTempTable]') AND type in (N'U'))
DROP TABLE [dbo].[IamTempTable]
GO
SELECT * INTO [dbo].[IamTempTable]
FROM
(
SELECT DISTINCT A.TABLE_SCHEMA,A.TABLE_NAME,B.CONSTRAINT_NAME,B.CONSTRAINT_TYPE ,
SUBSTRING((
SELECT ', ' + KCU.COLUMN_NAME
FROM [DBName1].INFORMATION_SCHEMA.TABLES AS T
JOIN [DBName1].INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON TC.TABLE_NAME = T.TABLE_NAME
JOIN [DBName1].INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU ON TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME AND TC.TABLE_NAME = KCU.TABLE_NAME
WHERE T.TABLE_NAME = A.TABLE_NAME AND TC.CONSTRAINT_NAME = B.CONSTRAINT_NAME-- AND KCU.COLUMN_NAME = C.COLUMN_NAME
ORDER BY KCU.[ORDINAL_POSITION] FOR XML PATH('') ), 2, 8000) AS KEY_COLUMNS
FROM [DBName1].INFORMATION_SCHEMA.TABLES A
JOIN [DBName1].INFORMATION_SCHEMA.TABLE_CONSTRAINTS B ON A.TABLE_NAME = B.TABLE_NAME
JOIN [DBName1].INFORMATION_SCHEMA.KEY_COLUMN_USAGE C
ON A.TABLE_NAME = B.TABLE_NAME AND C.CONSTRAINT_NAME =B.CONSTRAINT_NAME
EXCEPT
SELECT DISTINCT A.TABLE_SCHEMA COLLATE SQL_Latin1_General_CP1_CI_AS ,A.TABLE_NAME COLLATE SQL_Latin1_General_CP1_CI_AS ,B.CONSTRAINT_NAME COLLATE SQL_Latin1_General_CP1_CI_AS ,B.CONSTRAINT_TYPE COLLATE SQL_Latin1_General_CP1_CI_AS ,
SUBSTRING((
SELECT ', ' + KCU.COLUMN_NAME
FROM [DBName2].INFORMATION_SCHEMA.TABLES AS T
JOIN [DBName2].INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON TC.TABLE_NAME = T.TABLE_NAME
JOIN [DBName2].INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU ON TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME AND TC.TABLE_NAME = KCU.TABLE_NAME
WHERE T.TABLE_NAME = A.TABLE_NAME AND TC.CONSTRAINT_NAME = B.CONSTRAINT_NAME-- AND KCU.COLUMN_NAME = C.COLUMN_NAME
ORDER BY KCU.[ORDINAL_POSITION] FOR XML PATH('') ), 2, 8000) COLLATE SQL_Latin1_General_CP1_CI_AS AS KEY_COLUMNS
FROM [DBName2].INFORMATION_SCHEMA.TABLES A
JOIN [DBName2].INFORMATION_SCHEMA.TABLE_CONSTRAINTS B ON A.TABLE_NAME = B.TABLE_NAME
JOIN [DBName2].INFORMATION_SCHEMA.KEY_COLUMN_USAGE C
ON A.TABLE_NAME = B.TABLE_NAME AND C.CONSTRAINT_NAME =B.CONSTRAINT_NAME
) A
GO
SELECT 'USE [DBName2]'
UNION ALL
SELECT 'GO'
UNION ALL
SELECT '-- CREATE CONSTRAINTS WHICH ARE THERE IN LATER VERSION'
UNION ALL
SELECT
'IF OBJECT_ID(N'''+A.DEFAULT_CONSTRAINT_NAME+''') IS NULL ALTER TABLE ['+A.TABLE_SCHEMA+'].['+A.TABLE_NAME+'] ADD CONSTRAINT ['+A.DEFAULT_CONSTRAINT_NAME+'] DEFAULT '+ A.DEFINITION + ' FOR '+ A.COLUMN_NAME + ' ' + ' GO'
FROM
(
SELECT SDC.NAME AS DEFAULT_CONSTRAINT_NAME,SDC.DEFINITION , AC.NAME AS COLUMN_NAME, T.NAME AS TABLE_NAME,S.name AS TABLE_SCHEMA
FROM [DBName1].SYS.TABLES T
JOIN [DBName1].SYS.schemas S ON T.schema_id = S.schema_id
JOIN [DBName1].SYS.ALL_OBJECTS AO on AO.name = T.name
join [DBName1].SYS.ALL_COLUMNS AC on AO.object_id = AC.object_id
JOIN [DBName1].SYS.DEFAULT_CONSTRAINTS SDC ON SDC.parent_OBJECT_ID = AC.object_id AND SDC.parent_column_id = AC.column_id
--AND SDC.object_id = AO.object_id
EXCEPT
SELECT SDC.NAME COLLATE SQL_Latin1_General_CP1_CI_AS AS DEFAULT_CONSTRAINT_NAME,SDC.DEFINITION COLLATE SQL_Latin1_General_CP1_CI_AS , AC.NAME COLLATE SQL_Latin1_General_CP1_CI_AS AS COLUMN_NAME, T.NAME COLLATE SQL_Latin1_General_CP1_CI_AS AS TABLE_NAME,S.name COLLATE SQL_Latin1_General_CP1_CI_AS AS TABLE_SCHEMA
FROM [DBName2].SYS.TABLES T
JOIN [DBName2].SYS.schemas S ON T.schema_id = S.schema_id
JOIN [DBName2].SYS.ALL_OBJECTS AO on AO.name = T.name AND AO.schema_id = T.schema_id
join [DBName2].SYS.ALL_COLUMNS AC on AO.object_id = AC.object_id
JOIN [DBName2].SYS.DEFAULT_CONSTRAINTS SDC ON SDC.parent_OBJECT_ID = AC.object_id AND SDC.parent_column_id = AC.column_id
--AND SDC.object_id = AO.object_id
) A
UNION ALL
SELECT 'GO'
UNION ALL
SELECT '-- DROP CONSTRAINTS WHICH ARE NOT THERE IN LATER VERSION'
UNION ALL
SELECT --DISTINCT T.TABLE_NAME,B.CONSTRAINT_NAME,B.CONSTRAINT_TYPE
DISTINCT
'IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'''+T.TABLE_NAME+''') AND name = N'''+B.CONSTRAINT_NAME+''') ALTER TABLE ['+T.TABLE_SCHEMA+'].['+T.TABLE_NAME+'] DROP CONSTRAINT ['+B.CONSTRAINT_NAME+']'+ ' GO'
FROM [dbo].[IamTempTable] T
JOIN [DBName2].INFORMATION_SCHEMA.TABLES A ON A.TABLE_NAME COLLATE SQL_Latin1_General_CP1_CI_AS = T.TABLE_NAME AND A.TABLE_SCHEMA COLLATE SQL_Latin1_General_CP1_CI_AS = T.TABLE_SCHEMA
JOIN [DBName2].INFORMATION_SCHEMA.TABLE_CONSTRAINTS B ON A.TABLE_NAME = B.TABLE_NAME AND A.TABLE_SCHEMA = B.TABLE_SCHEMA
WHERE B.TABLE_SCHEMA COLLATE SQL_Latin1_General_CP1_CI_AS = T.TABLE_SCHEMA AND B.TABLE_NAME COLLATE SQL_Latin1_General_CP1_CI_AS = T.TABLE_NAME AND B.CONSTRAINT_TYPE COLLATE SQL_Latin1_General_CP1_CI_AS = T.CONSTRAINT_TYPE
UNION ALL
SELECT 'GO'
--UNION ALL
--SELECT '--THIS SQL STATEMENT EXPLICITLY FOR  DATA MIGRATION'
--UNION ALL
--SELECT 'WITH CTE_Dup AS ( SELECT *, ROW_NUMBER()OVER ( PARTITION BY BoardId, ValidatorFunctionId, [Parameters] ORDER BY SBoardId, ValidatorFunctionId, [Parameters]) AS ROW_NO FROM [Config]) DELETE FROM CTE_Dup WHERE ROW_NO > 1; '
UNION ALL
--SELECT 'GO'
--UNION ALL
SELECT '-- CREATE NEW CONSTRAINTS FROM LATER VERSION'
UNION ALL
SELECT --DISTINCT TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,KEY_COLUMNS
DISTINCT
'IF EXISTS (SELECT * FROM sys.indexes WHERE OBJECT_NAME(OBJECT_ID) = N'''+TABLE_NAME +''' AND name = N'''+CONSTRAINT_NAME+''')'+
CASE WHEN CONSTRAINT_TYPE IN ('PRIMARY KEY') THEN 'ALTER TABLE ['+TABLE_SCHEMA+'].['+ TABLE_NAME +'] DROP CONSTRAINT ['+CONSTRAINT_NAME +'] '
ELSE 'DROP INDEX ['+CONSTRAINT_NAME+'] ON ['+TABLE_SCHEMA+'].['+ TABLE_NAME +'] WITH ( ONLINE = OFF ) ' END+
'GO ;WITH CTE_Dup AS ( SELECT *, ROW_NUMBER()OVER ( PARTITION BY ' + + KEY_COLUMNS + ' ORDER BY ' + KEY_COLUMNS + ' ) AS ROW_NO FROM ['+TABLE_SCHEMA+'].['+ TABLE_NAME +'] ) DELETE FROM CTE_Dup WHERE ROW_NO > 1; '
+' IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_NAME = '''+CONSTRAINT_NAME+''' AND TABLE_NAME = '''+TABLE_NAME+''' AND TABLE_SCHEMA = '''+TABLE_SCHEMA +''') ALTER TABLE ['+TABLE_SCHEMA+'].['+ TABLE_NAME +'] ADD CONSTRAINT ['+ CONSTRAINT_NAME+'] '+ CASE WHEN CONSTRAINT_TYPE='PRIMARY KEY' THEN 'PRIMARY KEY CLUSTERED ' WHEN CONSTRAINT_TYPE='UNIQUE' THEN 'UNIQUE NONCLUSTERED ' END+' ( '+ KEY_COLUMNS +
')WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO'
FROM IamTempTable T
UNION ALL
SELECT 'GO '
GO
--IDENTIFY NEW CONSTRAINTS HAS BEEN CREATED IN LATER VERSIONUSE [DBName1]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IamTempTable]') AND type in (N'U'))
DROP TABLE [dbo].[IamTempTable]
GO

GENERIC 14. Drop Tables & Columns which are not there in Later version

USE DBName2
GO
SELECT 'USE DBName2 '
UNION ALL
SELECT 'GO'
UNION ALL
SELECT '-- DROP TABLES WHICH ARE NOT THERE IN LATER VERSION'
UNION ALL
SELECT
DISTINCT -- TABLE_NAME
'IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '''+A.TABLE_SCHEMA +''' AND TABLE_NAME = '''+A.TABLE_NAME+''') DROP TABLE ['+A.TABLE_SCHEMA +'].['+A.TABLE_NAME + ']'+ ' GO'
FROM DBName2.INFORMATION_SCHEMA.TABLES A
WHERE TABLE_NAME COLLATE SQL_Latin1_General_CP1_CI_AS NOT IN ( SELECT DISTINCT TABLE_NAME FROM [DBName1].INFORMATION_SCHEMA.TABLES) AND TABLE_NAME NOT LIKE 'SYS%'
UNION ALL
SELECT 'GO'
UNION ALL
SELECT '-- DROP COLUMNS WHICH ARE NOT THERE IN LATER VERSION'
UNION ALL
SELECT DISTINCT --A.TABLE_NAME,B.COLUMN_NAME
'IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '''+B.TABLE_SCHEMA +''' AND TABLE_NAME = '''+B.TABLE_NAME+''' AND COLUMN_NAME = '''+B.COLUMN_NAME+''') ALTER TABLE ['+A.TABLE_SCHEMA +'].['+A.TABLE_NAME + '] DROP COLUMN ['+B.COLUMN_NAME+'] '+ ' GO'
FROM
DBName2.INFORMATION_SCHEMA.TABLES A
LEFT JOIN DBName2.INFORMATION_SCHEMA.COLUMNS B ON A.TABLE_NAME = B.TABLE_NAME
LEFT JOIN [DBName1].INFORMATION_SCHEMA.TABLES C ON A.TABLE_NAME COLLATE SQL_Latin1_General_CP1_CI_AS = C.TABLE_NAME
LEFT JOIN [DBName1].INFORMATION_SCHEMA.COLUMNS D ON D.TABLE_NAME = C.TABLE_NAME
WHERE B.COLUMN_NAME COLLATE SQL_Latin1_General_CP1_CI_AS NOT IN ( SELECT COLUMN_NAME FROM [DBName1].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = A.TABLE_NAME COLLATE SQL_Latin1_General_CP1_CI_AS )
AND A.TABLE_TYPE = 'BASE TABLE' AND A.TABLE_NAME NOT LIKE 'SYS%'