Monday, 1 July 2013

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

No comments:

Post a comment