Merge Bug 진짜 당했다..

http://sqlblog.com/blogs/paul_white/archive/2010/08/04/another-interesting-merge-bug.aspx
http://www.sqlperformance.com/2013/02/t-sql-queries/another-merge-bug

Tip on using caution with MERGE - Aaron Bertrand
http://www.mssqltips.com/sqlservertip/3074/tip-on-using-caution-with-merge/ 

Bug는 언제나 존재한다... but 나에게 올줄이야~ ㅡ.ㅡ


-- ===================================================================
-- Merge Test
-- Update : 
-- Update Date : 2013.09.02
-- Desc : Merge를 사용하는 SQL에 이상 현상 발견 
--
--		http://www.sqlperformance.com/2013/02/t-sql-queries/another-merge-bug
		http://sqlblog.com/blogs/paul_white/archive/2010/08/04/another-interesting-merge-bug.aspx

	

-- ===================================================================
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
GO

DECLARE @Target
TABLE   (
        row_id  INTEGER NOT NULL PRIMARY KEY,
        value   INTEGER NOT NULL
        );
 
DECLARE @Delta
TABLE   (
        row_id  INTEGER NOT NULL PRIMARY KEY,
        delta   INTEGER NOT NULL
        );
 
-- Existing records (1 & 3)
INSERT  @Target
        (row_id, value)
VALUES  (1, 1),
        (3, 3),
		(5, 3);

 
 -- 비정상 수행
MERGE   @Target T
USING  ( SELECT * FROM @Target WHERE row_id = 2  ) AS D (  row_id, delta )	-- ##. ROW COUNT가 0일 경우(NULL) 
        ON  D.row_id = T.row_id
WHEN    MATCHED THEN
        UPDATE SET T.value += D.delta
WHEN    NOT MATCHED THEN 
        INSERT VALUES (D.row_id, D.delta)
OUTPUT  D.row_id,
        $action,
        DELETED.value AS old_value,
        INSERTED.value AS new_value;

SELECT * FROM @Target;

-- 정상 수행
MERGE   @Target T
USING  ( SELECT 2, 3   ) AS D (  row_id, delta ) 
        ON  D.row_id = T.row_id
WHEN    MATCHED THEN
        UPDATE SET T.value += D.delta
WHEN    NOT MATCHED THEN 
        INSERT VALUES (D.row_id, D.delta)
OUTPUT  D.row_id,
        $action,
        DELETED.value AS old_value,
        INSERTED.value AS new_value;

SELECT * FROM @Target;


'Etc' 카테고리의 다른 글

SQL MDF, LDF 파일 수정한 날짜가 변경되지 않아요  (0) 2013.11.22
SQL Unplugged 2013 - 발표자료 다운로드  (0) 2013.10.29
query wait  (0) 2013.08.30
데이타베이스 모델링 sample  (0) 2013.07.17
추적 플래그 정리중  (0) 2013.07.03