Merge中的可选参数

时间:2013-02-17 10:02:35

标签: sql sql-server tsql upsert sql-merge

我有一个存储过程用于更新SQL Server数据库中的记录。

如果找到匹配项并且提供null作为变量,我想使用数据库中的现有值。

通常只有部分数据可用,因此程序在几个阶段执行以完成记录。每次执行时我并不总是拥有所有变量。

为什么以下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

1 个答案:

答案 0 :(得分: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