Monday 1 July 2013

GENERIC 12. Create new Constraints from Later version

--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]GOSELECT * 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 * FROM [dbo].[IamTempTable] WHERE CONSTRAINT_NAME = 'PK_tAccum2Day'GOSELECT 'USE [DBName2]'
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 BoardId, 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
' ;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 '
UNION ALL
SELECT '--Identify constraints which are not there in earlir version'
UNION ALL
--Identify constraints which are not there in earlir version
SELECT
'IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N''['+A.TABLE_SCHEMA+'].'+A.TABLE_NAME+''') AND name = N'''+A.CONSTRAINT_NAME+''') ALTER TABLE ['+A.TABLE_SCHEMA+'].['+A.TABLE_NAME+'] DROP CONSTRAINT ['+A.CONSTRAINT_NAME +'] GO'
FROM (
SELECT DISTINCT A.TABLE_SCHEMA,A.TABLE_NAME,D.CONSTRAINT_NAME,
SUBSTRING((
SELECT ', ' + KCU.COLUMN_NAME
FROM [DBName2].INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
WHERE TABLE_NAME = A.TABLE_NAME AND CONSTRAINT_NAME = D.CONSTRAINT_NAME AND TABLE_SCHEMA = A.TABLE_SCHEMA
ORDER BY KCU.[ORDINAL_POSITION] FOR XML PATH('') ), 2, 8000) AS KEY_COLUMNS
FROM DBName2.INFORMATION_SCHEMA.TABLES A
JOIN DBName2.INFORMATION_SCHEMA.TABLE_CONSTRAINTS C ON A.TABLE_NAME = C.TABLE_NAME AND A.TABLE_SCHEMA = C.TABLE_SCHEMA
JOIN DBName2.INFORMATION_SCHEMA.KEY_COLUMN_USAGE D ON D.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND A.TABLE_NAME = D.TABLE_NAME AND A.TABLE_SCHEMA = D.TABLE_SCHEMA
WHERE D.COLUMN_NAME COLLATE SQL_Latin1_General_CP1_CI_AS NOT IN ( SELECT COLUMN_NAME FROM [DBName1].INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA =A.TABLE_SCHEMA COLLATE SQL_Latin1_General_CP1_CI_AS AND TABLE_NAME = A.TABLE_NAME COLLATE SQL_Latin1_General_CP1_CI_AS AND CONSTRAINT_NAME = D.CONSTRAINT_NAME COLLATE SQL_Latin1_General_CP1_CI_AS)
AND A.TABLE_TYPE = 'BASE TABLE' AND A.TABLE_NAME NOT LIKE 'SYSD%') A
GO
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

No comments:

Post a Comment