A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 鲜学良 中级黑马   /  2012-12-18 11:05  /  1485 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

1 个回复

倒序浏览
额,这个方法不错,转走慢慢研究
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马