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
旁註:你應該**不要**爲存儲過程使用'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
謝謝Marc,我會牢記這一點 – madlan 2013-02-17 10:37:21