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%'