Monday, 1 July 2013

GENERIC 8. Drop Indexes which are not there in Later version

--IDENTIFY NEW INDEXES HAS BEEN CREATED IN LATER VERSION
USE [DBName1]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IamSourceIndexTable]') AND type in (N'U'))
DROP TABLE [dbo].[IamSourceIndexTable]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IamTargetIndexTable]') AND type in (N'U'))
DROP TABLE [dbo].[IamTargetIndexTable]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OldIndexes]') AND type in (N'U'))
DROP TABLE [dbo].[OldIndexes]
GO
SELECT a.name COLLATE SQL_Latin1_General_CP1_CI_AS AS TABLE_NAME ,SCHEMA_NAME(SCHEMA_ID) COLLATE SQL_Latin1_General_CP1_CI_AS AS TABLE_SCHEMA,
B.name COLLATE SQL_Latin1_General_CP1_CI_AS AS INDEX_NAME,
AC.name COLLATE SQL_Latin1_General_CP1_CI_AS AS INDEX_COLUMN_NAME,IS_UNIQUE ,B.TYPE ,B.TYPE_DESC COLLATE SQL_Latin1_General_CP1_CI_AS AS TYPE_DESC,IS_PRIMARY_KEY ,IS_UNIQUE_CONSTRAINT
,SUBSTRING((
SELECT ', ' + AC.name
FROM [DBName2].SYS.TABLES AS T
INNER JOIN [DBName2].SYS.INDEXES I ON T.object_id = I.object_id
INNER JOIN [DBName2].SYS.INDEX_COLUMNS IC ON I.object_id = IC.object_id AND I.index_id = IC.index_id
INNER JOIN [DBName2].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 KeyCols
,SUBSTRING((
SELECT ', ' + AC.name
FROM [DBName2].SYS.TABLES AS T
INNER JOIN [DBName2].SYS.INDEXES I ON T.object_id = I.object_id
INNER JOIN [DBName2].SYS.INDEX_COLUMNS IC ON I.object_id = IC.object_id AND I.index_id = IC.index_id
INNER JOIN [DBName2].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 IncludeCols
INTO IamSourceIndexTable
FROM [DBName2].SYS.TABLES A
JOIN [DBName2].SYS.INDEXES B ON A.object_id = B.object_id
JOIN [DBName2].SYS.INDEX_COLUMNS C ON C.object_id = A.object_id AND B.index_id = C.index_id
JOIN [DBName2].SYS.ALL_COLUMNS AC ON AC.object_id = A.object_id AND AC.column_id = C.column_id
WHERE A.name NOT LIKE 'SYS%'GOSELECT a.name COLLATE SQL_Latin1_General_CP1_CI_AS AS TABLE_NAME ,SCHEMA_NAME(SCHEMA_ID) COLLATE SQL_Latin1_General_CP1_CI_AS AS TABLE_SCHEMA,
B.name COLLATE SQL_Latin1_General_CP1_CI_AS AS INDEX_NAME,
AC.name COLLATE SQL_Latin1_General_CP1_CI_AS AS INDEX_COLUMN_NAME,IS_UNIQUE ,B.TYPE ,B.TYPE_DESC COLLATE SQL_Latin1_General_CP1_CI_AS AS TYPE_DESC,IS_PRIMARY_KEY ,IS_UNIQUE_CONSTRAINT
,SUBSTRING((
SELECT ', ' + AC.name
FROM [DBName2].SYS.TABLES AS T
INNER JOIN [DBName2].SYS.INDEXES I ON T.object_id = I.object_id
INNER JOIN [DBName2].SYS.INDEX_COLUMNS IC ON I.object_id = IC.object_id AND I.index_id = IC.index_id
INNER JOIN [DBName2].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 KeyCols
,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 IncludeCols
INTO IamTargetIndexTable
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
WHERE A.name NOT LIKE 'SYS%'
GO
SELECT * INTO [OldIndexes]
FROM (SELECT * FROM IamSourceIndexTable EXCEPT SELECT * FROM IamTargetIndexTable ) A
GO
SELECT 'USE [DBName2] '
UNION ALL
SELECT 'GO'
UNION ALL
SELECT '--DROP INDEXES FROM EARLIER VERSION WHICH ARE NOT THERE IN LATER VERSION'
UNION ALL
SELECT DISTINCT --TABLE_NAME,INDEX_NAME,IncludeCols,KeyCols,TYPE_DESC ,IS_PRIMARY_KEY,IS_UNIQUE_CONSTRAINT
'IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N''['+TABLE_SCHEMA+'].'+TABLE_NAME+''') AND name = N'''+INDEX_NAME+''') '+ CASE WHEN IS_PRIMARY_KEY = 1 OR IS_UNIQUE_CONSTRAINT = 1 THEN ' ALTER TABLE ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] DROP CONSTRAINT ['+INDEX_NAME+']  '
ELSE ' DROP INDEX [' + INDEX_NAME +'] ON ['+TABLE_SCHEMA+'].['+ TABLE_NAME +'] WITH ( ONLINE = OFF ) ' END + ' GO'
FROM [OldIndexes]
--WHERE is_primary_key = 1 OR is_unique_constraint = 1
--WHERE IncludeCols IS NOT NULL
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IamSourceIndexTable]') AND type in (N'U'))
DROP TABLE [dbo].[IamSourceIndexTable]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IamTargetIndexTable]') AND type in (N'U'))
DROP TABLE [dbo].[IamTargetIndexTable]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OldIndexes]') AND type in (N'U'))
DROP TABLE [dbo].[OldIndexes]
GO

No comments:

Post a comment