2013-02-17 4 views
1

SQL Server 데이터베이스의 레코드를 업데이트하는 데 사용되는 저장 프로 시저가 있습니다.Merge의 선택적 매개 변수

일치하는 항목이 있고 변수가 null 인 경우 데이터베이스에서 기존 값을 사용하고 싶습니다.

흔히 부분 데이터 만 사용할 수 있으므로 절차를 여러 단계에서 실행하여 레코드를 완료하십시오. 각 실행마다 항상 모든 변수가있는 것은 아닙니다.

왜 아래의 경우 작동하지 않습니까? 널 (NULL) 값이 제공된 경우 필드 내의 기존 데이터를 대체합니다.

ALTER PROCEDURE [dbo].[sp_UPSERT_Test] 

@ID int, 
@Account_ID varchar(15) 
@Name varchar(15) 

AS 
BEGIN 

MERGE INTO dbo.Database_Log AS target 
USING ( 
    SELECT @ID, @Account_ID ,@Account_ID) 
    AS source (ID, Account_ID, Name) 
ON target.ID = source.ID 

WHEN MATCHED 
THEN UPDATE 
SET 
    Account_ID = CASE 
    WHEN source.Account_ID = NULL 
    THEN target.Account_ID 
    ELSE source.Account_ID 
     END 
    ,Name = CASE 
    WHEN source.Name = NULL 
    THEN target.Name 
    ELSE source.Name 
     END) 

WHEN NOT MATCHED 
THEN INSERT (Account_ID, Name) 
     VALUES (Account_ID, Name); 

RETURN 
END 
+2

사이드 참고 : 해야 사용 IS NULL

이 시도 - NULL하지는 항등 연산자와 비교할 수있는 값입니다 ** 저장 프로 시저에 대한 접두어'sp_'를 사용하지 않습니다. Microsoft는 [자체 저장을 위해이 접두어를 예약했습니다 (* 저장 프로 시저 명명 * 참조)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) 및 당신은 미래에 언젠가 이름 충돌의 위험을 감수해야합니다. [또한 저장 프로 시저 성능에 좋지 않습니다.] (http://sqlserverpedia.com/blog/sql-server-bloggers/stored-procedure-performance-using-%E2%80%9Csp_%E2%80%9D-prefix- % E2 % 80 % 93-myth-or-fact /). 'sp_'를 피하고 다른 것을 접두어로 사용하는 것이 가장 좋습니다. –

+0

마크, 감사드립니다. – madlan

답변

1

NULL을 제대로 확인하지 않았을 수 있습니다. ** 당신이해야 :

SET  
    Account_ID = CASE 
        WHEN source.Account_ID IS NULL 
        THEN target.Account_ID 
        ELSE source.Account_ID 
       END 

사용 IS NULL 대신 = NULL