Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。”,通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的。
可以想象出,需要使用Merge的场景比如:
• 数据同步
• 数据转换
• 基于源表对目标表做Insert,Update,Delete操作
以下是批量修改实例
use BookShop
go
if exists (select 1
from sysobjects
where id = object_id('dbo.changeimg')
and type in ('P','PC'))
drop procedure dbo.changeimg
go
create procedure dbo.changeimg
(
@V_sTable dbo.ty_Books READONLY,
@OV_iReturnValue int = 0 OUTPUT
,@OV_sReturnText varchar(100)='' OUTPUT
)
/*
过程描述:修改图片地址
接口目的:
业务逻辑:
输入参数:
@V_sTable dbo.ty_Books 书籍类型表
*/
as
DECLARE @sProc varchar(40)
DECLARE @sError varchar(1000)
BEGIN
SET NOCOUNT ON
SELECT @OV_iReturnValue = 0
SELECT @OV_sReturnText = '修改成功'
BEGIN TRANSACTION
BEGIN TRY
--修改img地址信息
MERGE dbo.Books t/*目的表*/
USING @V_sTable o/*源表*/ ON t.ID = o.ID
WHEN MATCHED THEN UPDATE SET t.ISBN = o.ISBN;--如果匹配到了,就更新掉目标表
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF XACT_STATE() != 0
ROLLBACK TRANSACTION
SELECT @sProc=ERROR_PROCEDURE(),@sError=ERROR_MESSAGE()
SELECT @OV_iReturnValue = 200
SELECT @OV_sReturnText = '修改失败'
EXEC dbo.UP_Insert_tProcLog @sProc,@sError
END CATCH
SET NOCOUNT OFF
END
go
|