2013-02-17 44 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