Skip to content

Instantly share code, notes, and snippets.

@lionofdezert
Created November 29, 2013 18:40
Show Gist options
  • Save lionofdezert/7710146 to your computer and use it in GitHub Desktop.
Save lionofdezert/7710146 to your computer and use it in GitHub Desktop.
Stored Procedure, to create missing columns default values at target database by comparing both source and target databases.
--DROP IF ALREADY EXISTS
IF EXISTS ( SELECT 1
FROM SYS.procedures
WHERE NAME = 'SYNC_ColumnsDefaultValues' )
DROP PROC SYNC_ColumnsDefaultValues
GO
--CREATE PROCEDURE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
Stored Procedure, to create missing columns default values at target database by comparing
both source and target databases.
EXEC [dbo].[SYNC_ColumnsDefaultValues] 'AdventureWork_StableVersion','AventureWork_Target'
*/
CREATE PROCEDURE [dbo].[SYNC_ColumnsDefaultValues]
(
@SyncFromDB VARCHAR(200), --Source database name
@SyncToDB VARCHAR(200) --Target database name
)
AS
BEGIN
CREATE TABLE #AlterStatements ( TSQLStmt VARCHAR(MAX) )
EXEC
( 'INSERT INTO #AlterStatements
SELECT
CASE WHEN MM.COLTYPE = ''varchar''
or MM.COLTYPE = ''nvarchar''
or MM.COLTYPE = ''char''
or MM.COLTYPE = ''nchar''
THEN ''ALTER TABLE ' + @SlaveDB
+ '.[dbo].['' + MM.TableName + ''] ALTER COLUMN [''
+ MM.name + ''] '' + MM.COLTYPE + ''(''
+ CAST(MM.max_length AS VARCHAR) + '') ''
+(SELECT ( case when IS_NULLABLE = ''No'' then '' NOT '' else '''' end ) + '' NULL ''
--+ CASE WHEN ISC.COLUMN_DEFAULT IS NOT NULL OR ISC.COLUMN_DEFAULT<>''''
-- THEN '' DEFAULT '' + ISC.COLUMN_DEFAULT
-- ELSE '''' END
FROM ' + @MasterDB + '.information_schema.columns ISC
WHERE ISC.table_name = MM.tablename
AND ISC.COLUMN_NAME=MM.NAME )
WHEN MM.COLTYPE = ''numeric''
or MM.COLTYPE = ''decimal''
THEN ''ALTER TABLE ' + @SlaveDB
+ '.[dbo].['' + MM.TableName + ''] ALTER COLUMN [''
+ MM.name + ''] '' + MM.COLTYPE + ''(''
+ CAST(MM.Precision AS VARCHAR) + '', ''
+ CAST(MM.Scale AS VARCHAR) + '') ''
+(SELECT ( case when IS_NULLABLE = ''No'' then '' NOT '' else '''' end ) + '' NULL ''
--+ CASE WHEN ISC.COLUMN_DEFAULT IS NOT NULL OR ISC.COLUMN_DEFAULT<>''''
-- THEN '' DEFAULT '' + ISC.COLUMN_DEFAULT
-- ELSE '''' END
FROM ' + @MasterDB + '.information_schema.columns ISC
WHERE ISC.table_name = MM.tablename
AND ISC.COLUMN_NAME=MM.NAME )
ELSE ''ALTER TABLE ' + @SlaveDB
+ '.[dbo].['' + MM.TableName + ''] ALTER COLUMN [''
+ MM.name + ''] '' + MM.COLTYPE
+(SELECT ( CASE WHEN IS_NULLABLE = ''No'' then '' NOT '' else '''' end ) + '' NULL ''
-- + CASE WHEN ISC.COLUMN_DEFAULT IS NOT NULL OR ISC.COLUMN_DEFAULT<>''''
--THEN '' DEFAULT '' + ISC.COLUMN_DEFAULT
--ELSE '''' END
FROM ' + @MasterDB
+ '.information_schema.columns ISC
WHERE ISC.table_name = MM.tablename
AND ISC.COLUMN_NAME=MM.NAME )
END
FROM ( SELECT YY.Name as ColType, XX.*
FROM ( SELECT AA.name as TableName,BB.*
FROM ' + @MasterDB
+ '.sys.objects AA,
'
+ @MasterDB
+ '.sys.columns BB
WHERE AA.object_id = BB.object_id
and AA.type = ''u''
) XX,
' + @MasterDB + '.sys.types YY
WHERE XX.user_type_id = YY.user_type_id
) as MM
left join ' + @MasterDB
+ '.sys.syscomments mSM on msm.id = mm.default_object_id
INNER JOIN ( SELECT YY.Name as ColType,
XX.*
FROM ( SELECT AA.name as TableName,BB.*
FROM '
+ @SlaveDB
+ '.sys.objects AA,
'
+ @SlaveDB
+ '.sys.columns BB
WHERE AA.object_id = BB.object_id
and AA.type = ''u''
) XX,
' + @SlaveDB
+ '.sys.types YY
WHERE XX.user_type_id = YY.user_type_id
) as SS on MM.tablename = SS.tablename
and MM.name = SS.name
left join ' + @SlaveDB
+ '.sys.syscomments sSM on sSM.id = ss.default_object_id
WHERE ( MM.max_length <> SS.max_length
or MM.ColType <> SS.Coltype
or mm.is_nullable <> ss.is_nullable
--or isnull(msm.text, '''') <> isnull(ssm.text, '''')
)
ORDER BY mm.TableName'
)
----CURSOR TO EXECUTE/PRINT EACH STATEMENT SEPARATELY-----
DECLARE MY_CURSOR CURSOR READ_ONLY
FOR SELECT TSQLStmt
FROM #AlterStatements
OPEN My_Cursor
DECLARE @SQLstmt VARCHAR(MAX)
Fetch NEXT FROM MY_Cursor INTO @SQLstmt
While ( @@FETCH_STATUS <> -1 )
BEGIN
EXEC ( @SQLstmt
)
-- PRINT ( @SQLstmt)
FETCH NEXT FROM MY_CURSOR INTO @SQLstmt
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
-----
DROP TABLE #AlterStatements
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment