2013-02-17 18 views
1

我有一個存儲過程用於更新SQL Server數據庫中的記錄。合併中的可選參數

我想如果發現匹配和空被設置爲變量的數據庫中使用現有的值。這樣的程序可以在幾個階段執行完成備案

往往只有部分數據是可用的。我並不總是在每次執行時都有所有變量。

爲什麼下面的CASE不起作用?如果提供了空值,它將替換該字段中的現有數據。

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

旁註:你應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](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-神話或-事實/)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! – 2013-02-17 10:03:29

+0

謝謝Marc,我會牢記這一點 – madlan 2013-02-17 10:37:21

回答

1

也許是因爲您沒有正確檢查NULLNULL你可以用等號運算符比較值 - 你必須使用IS NULL

試試這個:

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

使用IS NULL,而不是= NULL