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