본문 바로가기

데이터베이스/MSSQL

데이터베이스 간의 테이블 컬럼 정보 비교해서 없는 경우 해당 컬럼 생성 처리

아래의 내용은 sql 2008 에서 처리 할 수 있습니다. 오늘 계속 고민끝에 생각해서 작성 했습니다. A데이터 베이스와 B 데이터 베이스의 각각의 같은 테이블에서 테이블 간의 컬럼 정보를 비교 하여 동기화 처리 및 한쪽의 컬럼이 변경되면 다른 한곳도 추가 하여 컬럼을 추가 해 주는 프로시져. 예제 실제 사용 예제
USE [JSCORP_CLD]
GO
/****** Object:  StoredProcedure [dbo].[usp_alter_Col]    Script Date: 01/28/2013 22:15:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_alter_Col](
	@uTable NVARCHAR(10)
)
AS
	IF EXISTS(
				SELECT C.*
					FROM
					 JSERP.sys.columns AS C
					 JOIN JSERP.sys.tables T ON C.object_id = T.object_id
					WHERE T.name=@uTable
							AND C.name NOT IN (
							 SELECT JC.name
							 FROM
							 JSCORP_CLD.sys.columns JC
							 JOIN JSCORP_CLD.sys.tables JT ON JC.object_id = JT.object_id
							 WHERE JT.name =@uTable
						)
				)
	BEGIN
	DECLARE @othercol sysname
	DECLARE @COLNAME  sysname
	DECLARE @DATATYPE NVARCHAR(128)
	DECLARE @CHARLEN INT
	DECLARE @NUMERICLEN TINYINT
	DECLARE @NUMERIC_SCALE INT

	DECLARE @usSql NVARCHAR(max)

	DECLARE COL_CR CURSOR FOR 

	SELECT C.name
	FROM
	 JSERP.sys.columns AS C
	 JOIN JSERP.sys.tables T ON C.object_id = T.object_id
	WHERE T.name=@uTable
			AND C.name NOT IN (
			 SELECT JC.name
			 FROM
			 JSCORP_CLD.sys.columns JC
			 JOIN JSCORP_CLD.sys.tables JT ON JC.object_id = JT.object_id
			 WHERE JT.name =@uTable
		)
		
	OPEN COL_CR

	FETCH NEXT FROM COL_CR INTO @othercol

	WHILE @@FETCH_STATUS = 0
	BEGIN
		 SELECT  @COLNAME = COLUMN_NAME, @DATATYPE = DATA_TYPE, @CHARLEN = CHARACTER_MAXIMUM_LENGTH, @NUMERICLEN = NUMERIC_PRECISION,@NUMERIC_SCALE = NUMERIC_SCALE
		 FROM JSERP.INFORMATION_SCHEMA.COLUMNS 
		 WHERE TABLE_NAME = @uTable AND COLUMN_NAME=@othercol
		 ORDER BY ORDINAL_POSITION	
		 
		 PRINT @COLNAME
		 
		 IF @DATATYPE = 'decimal' OR @DATATYPE = 'numeric'
			 BEGIN
				SET @usSql = 'ALTER TABLE ' + @uTable + ' ADD ' + @COLNAME + ' ' + @DATATYPE + ' (' + CONVERT(VARCHAR(3),@NUMERICLEN )  + ',' + CONVERT(VARCHAR(3), @NUMERIC_SCALE) +') ' 
				
			 END
		 ELSE
			BEGIN
				SET @usSql = 'ALTER TABLE ' + @uTable + ' ADD ' + @COLNAME + ' ' + @DATATYPE + ' (' + CONVERT(VARCHAR(3), @CHARLEN) +') ' 
			END
			
		EXEC dbo.exec_do @usSql
			
	FETCH NEXT FROM COL_CR INTO @othercol
	END
	
	CLOSE COL_CR
	DEALLOCATE COL_CR

	 
	END