我有一个存储过程用于更新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
答案 0 :(得分:1)
也许是因为你没有正确检查NULL
? NULL
不您可以与等值运算符进行比较的值 - 您必须使用IS NULL
试试这个:
SET
Account_ID = CASE
WHEN source.Account_ID IS NULL
THEN target.Account_ID
ELSE source.Account_ID
END
使用IS NULL
代替= NULL