Created
November 29, 2013 18:40
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--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