我有一个包含以下内容的存储过程。
这用于检查是否存在某个ID。如果不是,则将新记录插入表中,如果是,则更新现有记录。
该过程按预期工作,但我想知道我是否可以使用MERGE来改善代码。 有人可以告诉我如何使用MERGE进行此操作,并且与我的相比有任何优点/缺点吗?
BEGIN
IF NOT EXISTS
(
SELECT *
FROM MOC_Comments
WHERE commentID = @commentID
)
BEGIN
INSERT INTO MOC_Comments
(
parentID,
comment
)
SELECT @parentID,
@comment
END
ELSE
BEGIN
UPDATE MOC_Comments
SET parentID = @parentID,
comment = @comment
END
END
非常感谢你提供任何帮助,蒂姆。
答案 0 :(得分:1)
这是执行您正在寻找的基本合并语句:
我更新了合并的“更新”部分,以显示如何更新记录而不传入“set”方法中的每个参数。合并首先检查源(输入参数),如果为null,它将使用记录中的现有值。这允许您编写一个包含所有可为空参数的set方法,一个用于表或结构中的每一列(唯一约束或主键除外),并且只传入要更新相应记录列的参数。
merge into [dbo].[moc_comments] as target
using (values(@parentid
, @comment
, @commentid)) as source ([parentid], [comment], [commentid])
on target.[commentid] = source.[commentid]
when matched then
update set target.[parentid] = coalesce(source.[parentid], target.[parentid])
, target.[comment] = coalesce(source.[comment], target.[comment])
when not matched by target then
insert ([parentid]
, [comment]
, [commentid])
values ([parentid]
, [comment]
, [commentid]);