MSSQL MERGE사용 안하고 있으면 UPDATE 없으면 INSERT 하기

SQLServer 2008 이상이면 MERGE를 사용하여 데이터가 있으면 UPDATE 없으면 INSERT를 할 수 있습니다.

SQLServer 2005에서는 MERGE를 사용할 수 없기 때문에 직접 만들어줘야 합니다.

그러면 바로 작성방법을 보도록 하겠습니다.

먼저 테스트용 테이블을 작성하겠습니다.

-- 테스트용 테이블
CREATE TABLE [dbo].[Test](
	[TestID] [bigint] NOT NULL,
	[TestCD] [char](3) NOT NULL,
	[TestName] [nvarchar](10) NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
(
	[TestID] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF)
)
GO

-- 테스트용 테이터 추가
INSERT INTO Test(TestID, TestCD, TestName) VALUES (10000, '001', 'kim');
INSERT INTO Test(TestID, TestCD, TestName) VALUES (20000, '002', 'lee');

 

추가하려는 레코드가 존재하면 UPDATE, 없으면 INSERT하는 부분을 만들도록 하겠습니다.

-- 있으면 UPDATE, 없으면 INSERT
UPDATE Test 
SET 
	TestCD='001', 
	TestName='park'
WHERE 
	TestID = 10000
AND (TestCD <> '001' OR TestName <> 'park') -- 값이 변경되었을 경우에만 UPDATE
IF @@ROWCOUNT = 0
    INSERT INTO
	Test (TestID, TestCD, TestName)
    SELECT 
	10000, '001', 'park'
    WHERE NOT EXISTS (
	SELECT TOP 1 1 FROM Test WHERE TestID = 10000
)

 

IF @@ROWCOUNT = 0 로 판단하여 UPDATE를 할지 INSERT를 할지 처리하고 있습니다.

WHERE조건과 일치하여 UPDATE가 발생하면 @@ROWCOUNT는 0이 아니기 때문에 INSERT를 하지 않습니다.

WHERE조건과 일치하지 않아 UPDATE가 실행되지 않았다면 @@ROWCOUNT는 0이 되기 때문에 INSERT가 실행됩니다.

추가로 UPDATE가 되었는지 INSERT가 되었는지 확인하고 싶은 경우에는 다음과 같이 작성할 수 있습니다.

-- 있으면 UPDATE, 없으면 INSERT
UPDATE 
	Test 
SET 
	TestCD='001', 
	TestName='park'
WHERE 
	TestID = 10000
AND (TestCD <> '001' OR TestName <> 'park')
IF @@ROWCOUNT = 0
    BEGIN
    INSERT INTO 
	Test(TestID, TestCD, TestName)
    SELECT 
	10000, '001', 'park'
    WHERE NOT EXISTS (
        SELECT TOP 1 1 FROM Test WHERE TestID = 10000
    )
    IF @@ROWCOUNT > 0
	SELECT 'inserted'
    ELSE
	SELECT 'no updated'
    END
ELSE
	SELECT 'updated'

 

반환값

inserted – 추가

updated – 갱신

no updated – 데이터는 존재하지만 값변경은 없음.

 

있으면 UPDATE, 없으면 INSERT 양식

/*
    UPDATE 작성 부분
*/
IF @@ROWCOUNT = 0
    BEGIN
/*
    INSERT 작성 부분
*/
    IF @@ROWCOUNT > 0
	SELECT 'inserted'
    ELSE
	SELECT 'no updated'
    END
ELSE
	SELECT 'updated'

 

 UPDATE 작성 부분과  INSERT 작성 부분에 사용할 처리를 넣으면 됩니다.

댓글