티스토리 뷰

Computer/Databases

[MSSQL] IF NOT EXISTS 활용

인생이글케쉬우냐 2010. 1. 7. 13:58
매번 실서버에 디비의 변경된 스키마가 적용됐는지 확인하려면 컬럼을 존재하는지 일일히 select날려 체크하고 있으면 냅두고 없으면 alter해주곤했었다.
근데 if not exists를 이용하면 더 간단히 할 수 있다는걸 알았다.


[이전에 내가 사용했던 방식]
SELECT TOP 1 GPS_ACCURACY FROM  TB_TRACKER;
ALTER TABLE TB_TRACKER ADD GPS_ACCURACY INT NOT NULL CONSTRAINT DF_TB_TRACKER_GPS_ACCURACY DEFAULT (0);

[if not exists 사용]
-- 1. 컬럼
IF NOT EXISTS 
    (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TB_TRACKER' AND COLUMN_NAME='GPS_ACCURACY')
    ALTER TABLE TB_TRACKER ADD GPS_ACCURACY INT NOT NULL CONSTRAINT DF_TB_TRACKER_GPS_ACCURACY DEFAULT (0)
GO

-- 2. 테이블
IF NOT EXISTS 
    (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='TB_FAV_ADDRESS')
    CREATE TABLE TB_FAV_ADDRESS (
		ADDRESS_ID			DECIMAL(18, 0) IDENTITY(1,1) NOT NULL PRIMARY KEY,
		ADDRESS_NM			VARCHAR(255) NOT NULL,
		ADDRESS				VARCHAR(255) NULL,
		LAT_NO				REAL,
		LON_NO				REAL,
		DESCRIPTION			VARCHAR(255),
		OPT_DISPLAY_MS		BIT NOT NULL DEFAULT(0),
		USER_ID				DECIMAL(18, 0) NOT NULL
	)
GO

-- 3. 컬럼 추가 후 업데이트 할 경우,
IF NOT EXISTS 
    (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TB_TRACKER' AND COLUMN_NAME='MDATE_DT')
	BEGIN
		DECLARE @SQL VARCHAR(2000);
		SET @SQL = 'ALTER TABLE TB_TRACKER ADD MDATE_DT DATETIME NOT NULL DEFAULT GETDATE()';
		EXEC(@SQL);
		SET @SQL = 'UPDATE TB_TRACKER SET MDATE_DT = CDATE_DT';
		EXEC(@SQL);
	END
GO

-- 3-1. 컬럼 추가후 업데이트 여러쿼리 할경우,
IF NOT EXISTS 
    (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TB_CODE' AND COLUMN_NAME='CODE_IMG')
	BEGIN
		DECLARE @SQL VARCHAR(2000);
		SET @SQL = 'ALTER TABLE TB_CODE ADD CODE_IMG VARCHAR(255) DEFAULT ('''');';
		EXEC(@SQL);
		SET @SQL = 'UPDATE TB_CODE SET CODE_IMG = '''';';
		EXEC(@SQL);
		SET @SQL = 'UPDATE TB_CODE SET CODE_IMG=''event/journeystart.gif''           WHERE CODE_GRP_ID = ''C005'' AND CODE_ID=''11'';
			UPDATE TB_CODE SET CODE_IMG=''event/geofencein.gif''             WHERE CODE_GRP_ID = ''C005'' AND (CODE_ID>=''40'' AND CODE_ID<=''49'');
			UPDATE TB_CODE SET CODE_IMG=''event/evt_redlighton.gif''       WHERE CODE_GRP_ID = ''C005'' AND CODE_ID=''85'';

			-- for tracker
			UPDATE TB_CODE SET CODE_IMG=''tracker/''+CODE_ID+''_eB_h00.png''           WHERE CODE_GRP_ID = ''C051'';'
		EXEC(@SQL);
	END
GO


프로시저나 펑션의 경우도 같은 방법으로 사용가능하며,
컬럼의 내용을 업데이트하거나 인서트할때는 아래 와 같이 사용하면된다.
UPDATE TB_CODE_GRP SET CODE_GRP_GE='Device Sub Type' WHERE CODE_GRP_ID='C043'
IF @@ROWCOUNT=0
    INSERT INTO TB_CODE_GRP (CODE_GRP_ID, CODE_GRP_GE)
	VALUES ('C043', 'Device Sub Type');
GO

[참조 : http://blog.naver.com/pythonist?Redirect=Log&logNo=20086222891]
반응형