Comparing schema differences between two given objects(tables/views)
DECLARE @SourcetTableOrViewName varchar(500)
DECLARE @TargetTableOrViewName varchar(500)
SET @SourcetTableOrViewName = 'SalesOrderHeader'
SET @TargetTableOrViewName = 'v_SalesOrderHeader'
IF CHARINDEX('.', @SourcetTableOrViewName) = 0
SET @SourcetTableOrViewName = 'dbo.' + @SourcetTableOrViewName
IF CHARINDEX('.', @TargetTableOrViewName) = 0
SET @TargetTableOrViewName = 'dbo.' + @TargetTableOrViewName
IF ( OBJECT_ID(@SourcetTableOrViewName) IS NOT NULL AND OBJECT_ID(@TargetTableOrViewName) IS NOT NULL )
BEGIN
;WITH SRC_CTE
AS
(SELECT
(TABLE_SCHEMA + '.' + TABLE_NAME) AS TABLENAME
,COLUMN_NAME
,COLUMN_DEFAULT
,IS_NULLABLE
,DATA_TYPE
,CASE WHEN DATA_TYPE IN ('bigint','bit','date','datetime','datetime2','datetimeoffset','float','geography','geometry'
,'hierarchyid','image','int','money','real','smalldatetime','smallint','smallmoney','sql_variant'
,'sysname','syspolicy_target_filters_type','text','time','timestamp','tinyint','uniqueidentifier','xml')
THEN 1
WHEN DATA_TYPE IN ('numeric','decimal') THEN 2
ELSE 0 -- 'binary','nchar','ntext','nvarchar','char','varbinary','varchar'
END AS TYPE_GROUP
,CHARACTER_MAXIMUM_LENGTH
,NUMERIC_PRECISION
,NUMERIC_SCALE
,COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (TABLE_SCHEMA + '.' + TABLE_NAME) = @SourcetTableOrViewName
),TRGT_CTE
AS
(SELECT
(TABLE_SCHEMA + '.' + TABLE_NAME) AS TABLENAME
,COLUMN_NAME
,COLUMN_DEFAULT
,IS_NULLABLE
,DATA_TYPE
,CASE WHEN DATA_TYPE IN ('bigint','bit','date','datetime','datetime2','datetimeoffset','float','geography','geometry'
,'hierarchyid','image','int','money','real','smalldatetime','smallint','smallmoney','sql_variant'
,'sysname','syspolicy_target_filters_type','text','time','timestamp','tinyint','uniqueidentifier','xml')
THEN 1
WHEN DATA_TYPE IN ('numeric','decimal') THEN 2
ELSE 0 -- 'binary','nchar','ntext','nvarchar','char','varbinary','varchar'
END AS TYPE_GROUP
,CHARACTER_MAXIMUM_LENGTH
,NUMERIC_PRECISION
,NUMERIC_SCALE
,COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (TABLE_SCHEMA + '.' + TABLE_NAME) = @TargetTableOrViewName
)
SELECT C1.TABLENAME SOURCE_TABLENAME
,C1.COLUMN_NAME SOURCE_COLUMNNAME
,CASE WHEN C1.TYPE_GROUP = 1 THEN C1.DATA_TYPE
WHEN C1.TYPE_GROUP = 2 THEN C1.DATA_TYPE + '(' + CAST(ISNULL(C1.NUMERIC_PRECISION,0) AS VARCHAR) + ',' + CAST(ISNULL(C1.NUMERIC_SCALE,0) AS VARCHAR) +')'
ELSE C1.DATA_TYPE + CASE WHEN C1.CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN '(' + CAST(ISNULL(C1.CHARACTER_MAXIMUM_LENGTH,0) AS VARCHAR) + ')'
ELSE ''
END
END AS SOURCE_DATATYPE
,C1.IS_NULLABLE SOURCE_IS_NULLABLE
,C1.COLLATION_NAME SOURCE_COLLATION_NAME
,C2.TABLENAME TARGET_TABLENAME
,C2.COLUMN_NAME TARGET_COLUMNNAME
,CASE WHEN C2.TYPE_GROUP = 1 THEN C2.DATA_TYPE
WHEN C2.TYPE_GROUP = 2 THEN C2.DATA_TYPE + '(' + CAST(ISNULL(C2.NUMERIC_PRECISION,0) AS VARCHAR) + ',' + CAST(ISNULL(C2.NUMERIC_SCALE,0) AS VARCHAR) +')'
ELSE C2.DATA_TYPE + CASE WHEN C2.CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN '(' + CAST(ISNULL(C2.CHARACTER_MAXIMUM_LENGTH,0) AS VARCHAR) + ')'
ELSE ''
END
END AS TARGET_DATATYPE
,C2.IS_NULLABLE TARGET_IS_NULLABLE
,C2.COLLATION_NAME TARGET_COLLATION_NAME
,CASE WHEN C1.COLUMN_NAME IS NULL THEN 0 ELSE 1 END AS IS_SRCCOLUMN_EXIST
,CASE WHEN C2.COLUMN_NAME IS NULL THEN 0 ELSE 1 END AS IS_TRGTCOLUMN_EXIST
INTO #TEMP
FROM SRC_CTE C1
FULL JOIN TRGT_CTE C2
ON C1.COLUMN_NAME = C2.COLUMN_NAME
SELECT *
,CASE WHEN (SOURCE_IS_NULLABLE <> TARGET_IS_NULLABLE) AND (SOURCE_COLLATION_NAME <> TARGET_COLLATION_NAME) THEN 'Collation/Null Constraint Issue'
WHEN ((SOURCE_DATATYPE <> TARGET_DATATYPE) AND(SOURCE_COLLATION_NAME <> TARGET_COLLATION_NAME)) THEN 'Data Type/Collation Issue'
WHEN (SOURCE_DATATYPE <> TARGET_DATATYPE) AND (SOURCE_IS_NULLABLE <> TARGET_IS_NULLABLE) THEN 'Data Type/Null Constraint Issue'
WHEN (SOURCE_COLLATION_NAME <> TARGET_COLLATION_NAME) THEN 'Collation Issue'
WHEN (SOURCE_DATATYPE <> TARGET_DATATYPE) THEN 'Data Type Issue'
WHEN (SOURCE_IS_NULLABLE <> TARGET_IS_NULLABLE) THEN 'NULL Constraint Issue'
WHEN IS_SRCCOLUMN_EXIST = 0 AND IS_TRGTCOLUMN_EXIST = 1 THEN 'Column Exist in Target,but not in source.'
WHEN IS_SRCCOLUMN_EXIST = 1 AND IS_TRGTCOLUMN_EXIST = 0 THEN 'Column Exist in Source,but not in target.'
ELSE 'Matched'
END AS [Difference]
FROM #TEMP
WHERE (SOURCE_DATATYPE <> TARGET_DATATYPE
OR SOURCE_IS_NULLABLE <> TARGET_IS_NULLABLE
OR SOURCE_COLLATION_NAME <> TARGET_COLLATION_NAME
OR IS_SRCCOLUMN_EXIST = 1
OR IS_TRGTCOLUMN_EXIST = 1)
IF OBJECT_ID('TEMPDB..#TEMP') IS NOT NULL
DROP TABLE #TEMP
END
DECLARE @TargetTableOrViewName varchar(500)
SET @SourcetTableOrViewName = 'SalesOrderHeader'
SET @TargetTableOrViewName = 'v_SalesOrderHeader'
IF CHARINDEX('.', @SourcetTableOrViewName) = 0
SET @SourcetTableOrViewName = 'dbo.' + @SourcetTableOrViewName
IF CHARINDEX('.', @TargetTableOrViewName) = 0
SET @TargetTableOrViewName = 'dbo.' + @TargetTableOrViewName
IF ( OBJECT_ID(@SourcetTableOrViewName) IS NOT NULL AND OBJECT_ID(@TargetTableOrViewName) IS NOT NULL )
BEGIN
;WITH SRC_CTE
AS
(SELECT
(TABLE_SCHEMA + '.' + TABLE_NAME) AS TABLENAME
,COLUMN_NAME
,COLUMN_DEFAULT
,IS_NULLABLE
,DATA_TYPE
,CASE WHEN DATA_TYPE IN ('bigint','bit','date','datetime','datetime2','datetimeoffset','float','geography','geometry'
,'hierarchyid','image','int','money','real','smalldatetime','smallint','smallmoney','sql_variant'
,'sysname','syspolicy_target_filters_type','text','time','timestamp','tinyint','uniqueidentifier','xml')
THEN 1
WHEN DATA_TYPE IN ('numeric','decimal') THEN 2
ELSE 0 -- 'binary','nchar','ntext','nvarchar','char','varbinary','varchar'
END AS TYPE_GROUP
,CHARACTER_MAXIMUM_LENGTH
,NUMERIC_PRECISION
,NUMERIC_SCALE
,COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (TABLE_SCHEMA + '.' + TABLE_NAME) = @SourcetTableOrViewName
),TRGT_CTE
AS
(SELECT
(TABLE_SCHEMA + '.' + TABLE_NAME) AS TABLENAME
,COLUMN_NAME
,COLUMN_DEFAULT
,IS_NULLABLE
,DATA_TYPE
,CASE WHEN DATA_TYPE IN ('bigint','bit','date','datetime','datetime2','datetimeoffset','float','geography','geometry'
,'hierarchyid','image','int','money','real','smalldatetime','smallint','smallmoney','sql_variant'
,'sysname','syspolicy_target_filters_type','text','time','timestamp','tinyint','uniqueidentifier','xml')
THEN 1
WHEN DATA_TYPE IN ('numeric','decimal') THEN 2
ELSE 0 -- 'binary','nchar','ntext','nvarchar','char','varbinary','varchar'
END AS TYPE_GROUP
,CHARACTER_MAXIMUM_LENGTH
,NUMERIC_PRECISION
,NUMERIC_SCALE
,COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (TABLE_SCHEMA + '.' + TABLE_NAME) = @TargetTableOrViewName
)
SELECT C1.TABLENAME SOURCE_TABLENAME
,C1.COLUMN_NAME SOURCE_COLUMNNAME
,CASE WHEN C1.TYPE_GROUP = 1 THEN C1.DATA_TYPE
WHEN C1.TYPE_GROUP = 2 THEN C1.DATA_TYPE + '(' + CAST(ISNULL(C1.NUMERIC_PRECISION,0) AS VARCHAR) + ',' + CAST(ISNULL(C1.NUMERIC_SCALE,0) AS VARCHAR) +')'
ELSE C1.DATA_TYPE + CASE WHEN C1.CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN '(' + CAST(ISNULL(C1.CHARACTER_MAXIMUM_LENGTH,0) AS VARCHAR) + ')'
ELSE ''
END
END AS SOURCE_DATATYPE
,C1.IS_NULLABLE SOURCE_IS_NULLABLE
,C1.COLLATION_NAME SOURCE_COLLATION_NAME
,C2.TABLENAME TARGET_TABLENAME
,C2.COLUMN_NAME TARGET_COLUMNNAME
,CASE WHEN C2.TYPE_GROUP = 1 THEN C2.DATA_TYPE
WHEN C2.TYPE_GROUP = 2 THEN C2.DATA_TYPE + '(' + CAST(ISNULL(C2.NUMERIC_PRECISION,0) AS VARCHAR) + ',' + CAST(ISNULL(C2.NUMERIC_SCALE,0) AS VARCHAR) +')'
ELSE C2.DATA_TYPE + CASE WHEN C2.CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN '(' + CAST(ISNULL(C2.CHARACTER_MAXIMUM_LENGTH,0) AS VARCHAR) + ')'
ELSE ''
END
END AS TARGET_DATATYPE
,C2.IS_NULLABLE TARGET_IS_NULLABLE
,C2.COLLATION_NAME TARGET_COLLATION_NAME
,CASE WHEN C1.COLUMN_NAME IS NULL THEN 0 ELSE 1 END AS IS_SRCCOLUMN_EXIST
,CASE WHEN C2.COLUMN_NAME IS NULL THEN 0 ELSE 1 END AS IS_TRGTCOLUMN_EXIST
INTO #TEMP
FROM SRC_CTE C1
FULL JOIN TRGT_CTE C2
ON C1.COLUMN_NAME = C2.COLUMN_NAME
SELECT *
,CASE WHEN (SOURCE_IS_NULLABLE <> TARGET_IS_NULLABLE) AND (SOURCE_COLLATION_NAME <> TARGET_COLLATION_NAME) THEN 'Collation/Null Constraint Issue'
WHEN ((SOURCE_DATATYPE <> TARGET_DATATYPE) AND(SOURCE_COLLATION_NAME <> TARGET_COLLATION_NAME)) THEN 'Data Type/Collation Issue'
WHEN (SOURCE_DATATYPE <> TARGET_DATATYPE) AND (SOURCE_IS_NULLABLE <> TARGET_IS_NULLABLE) THEN 'Data Type/Null Constraint Issue'
WHEN (SOURCE_COLLATION_NAME <> TARGET_COLLATION_NAME) THEN 'Collation Issue'
WHEN (SOURCE_DATATYPE <> TARGET_DATATYPE) THEN 'Data Type Issue'
WHEN (SOURCE_IS_NULLABLE <> TARGET_IS_NULLABLE) THEN 'NULL Constraint Issue'
WHEN IS_SRCCOLUMN_EXIST = 0 AND IS_TRGTCOLUMN_EXIST = 1 THEN 'Column Exist in Target,but not in source.'
WHEN IS_SRCCOLUMN_EXIST = 1 AND IS_TRGTCOLUMN_EXIST = 0 THEN 'Column Exist in Source,but not in target.'
ELSE 'Matched'
END AS [Difference]
FROM #TEMP
WHERE (SOURCE_DATATYPE <> TARGET_DATATYPE
OR SOURCE_IS_NULLABLE <> TARGET_IS_NULLABLE
OR SOURCE_COLLATION_NAME <> TARGET_COLLATION_NAME
OR IS_SRCCOLUMN_EXIST = 1
OR IS_TRGTCOLUMN_EXIST = 1)
IF OBJECT_ID('TEMPDB..#TEMP') IS NOT NULL
DROP TABLE #TEMP
END
Comments
Post a Comment