新版本的数据库中增加了OUTPUT子句,这个很好用,详细的使用方式大家可以参考SQL的联机帮助文档。这里仅记录下常用的场景:在对数据库进行增删改的时候我们有时候需要记录日志(这里指将日志记录在DB中而非文件),一般我们都是分2次操作来完成的,这个操作不是很友好,在OUTPUT之前貌似没有什么好的办法,现在一切都不同了,我们可以一次完成了,具体看代码:

-- =============================================
-- 使用OUTPUT 完成日志记录,这里只是简单的使用,
-- 详见联机帮助文档
-- =============================================
--插入同时记录日志
INSERT INTO Customers
OUTPUT 'Insert',INSERTED.CustomerID,USER INTO logs
SELECT '001QRT','AVCDE','PEK' --删除同时记录日志
DELETE a
OUTPUT
'Delete',
DELETED.CustomerID,
USER
INTO Logs FROM Customers a WHERE CustomerID=2 --更新同时记录日志
UPDATE Customers SET CustomerNumber='JJJAABBCC'
OUTPUT 'UPDATE',DELETED.CustomerID, INSERTED.CustomerID INTO logs
WHERE CustomerID = 3

  用到的表依然是前几篇文章用到的Customers,增加了一个日志表,列包括:自增列、操作名称、操作表的主键、操作人。今天看了下有关Merge的联机文档才发现前几天错怪了它,功能实在是强大,这里也只列常用的场景,代码就直接拿园子里的了,里面也用到了OUTPUT子句 :)

-- =============================================
-- MERGE用法详见联机帮助
-- =============================================
-- Source table
DECLARE @SourceTable TABLE
(
ID INT PRIMARY KEY,
DSPT VARCHAR(50)
)
-- Target table
DECLARE @TargetTable TABLE
(
ID INT PRIMARY KEY,
DSPT VARCHAR(50)
) -- Log table
DECLARE @Log TABLE
(
ID INT IDENTITY PRIMARY KEY,
Operation VARCHAR(20),
OldID INT,
OldValue VARCHAR(100),
NeID INT,
NewValue VARCHAR(100)
) -- Insert testing data
INSERT INTO @SourceTable VALUES
(1,'ST 1001'),
(2,'ST 1002'),
(3,'ST 1003'),
(4,'ST 1004'),
(5,'ST 1005') INSERT INTO @TargetTable VALUES
(1,'TT 1001'),
(2,'TT 1002'),
(3,'TT 1003'),
(6,'TT 1006'),
(7,'TT 1007') SELECT *
FROM @SourceTable
/**1 ST 10012 ST 10023 ST 10034 ST 10045 ST 1005**/
SELECT *
FROM @TargetTable
/**1 TT 10012 TT 10023 TT 10036 TT 10067 TT 1007**/
/** Merge operation **/
MERGE INTO @TargetTable AS T -- Merge data from source table into target table
USING @SourceTable AS S -- Using source table
ON T.ID = S.ID -- Join conditions
-- If join condition is true, then matched
WHEN MATCHED
-- Update or Delete operation
THEN UPDATE SET T.DSPT = S.DSPT
-- Not matched
WHEN NOT MATCHED BY TARGET
-- Insert new data
THEN INSERT VALUES(S.ID,S.DSPT)
-- Delete or update by using flag to indicate the values in target
-- table don't exist in source table
WHEN NOT MATCHED BY SOURCE
THEN DELETE
-- Can log the operation details by using output clause
OUTPUT $ACTION AS [ACTION],
Deleted.ID AS 'Deleted ID',
Deleted.DSPT AS 'Deleted Description',
Inserted.ID AS 'Inserted ID',
Inserted.DSPT AS 'Inserted Description'
INTO @Log; -- Show the changes
SELECT *
FROM @Log

  

OUTPUT、Merge语句的使用的更多相关文章

  1. 【SQL Server学习笔记】Delete 语句、Output 子句、Merge语句

    原文:[SQL Server学习笔记]Delete 语句.Output 子句.Merge语句 DELETE语句 --建表 select * into distribution from sys.obj ...

  2. 如何理解T-SQL中Merge语句

    写在前面的话:之前看过Merge语句,感觉没什么用,完全可以用其他的方式来替代,最近又看了看Merge语句,确实挺好用,可以少写很多代码,看起来也很紧凑,当然也有别的优点. ====正文开始===== ...

  3. SQL Server Merge语句的使用

    Merge关键字在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插 ...

  4. 【转载】SQL Server - 使用 Merge 语句实现表数据之间的对比同步

    原文地址:SQL Server - 使用 Merge 语句实现表数据之间的对比同步 表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT ...

  5. 转:SQL Server - 使用 Merge 语句实现表数据之间的对比同步

    表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup ...

  6. SQL Server - 使用 Merge 语句实现表数据之间的对比同步

    表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup ...

  7. 使用MERGE语句同步表

    先建好測试环境: USE TEMPDB GO IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1 IF OBJECT_ID('T2') IS NOT NULL D ...

  8. 如何理解T-SQL中Merge语句(二)

    写在前面的话:上一篇写了如何理解T-SQL中Merge语句,基本把Merge语句要讲的给讲了,在文章的后面,抛出了几个结,当时没有想明白怎么去用文字表达,这一篇就来解答一下这几个结,又是一篇“天马行空 ...

  9. merge 语句的语法

    /*Merge into 详细介绍 MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句. 通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询, 连接条 ...

  10. 使用 MERGE 语句实现增删改

    Ø  简介 在平常编写增删改的 SQL 语句时,我们用的最多的就是 INSERT.UPDATE 和 DELETE 语句,这是最基本的增删改语句.其实,SQL Server 中还有另外一个可以实现增删改 ...

随机推荐

  1. LeetCode解题报告:Reorder List

    Reorder List Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… Yo ...

  2. WordPress Ultimate Auction插件跨站请求伪造漏洞

    漏洞名称: WordPress Ultimate Auction插件跨站请求伪造漏洞 CNNVD编号: CNNVD-201306-396 发布时间: 2013-09-11 更新时间: 2013-09- ...

  3. 【转】ButterKnife基本使用--不错

    原文网址:http://www.cnblogs.com/mengdd/archive/2015/06/23/4595973.html Butter Knife处理字段和方法绑定. 配置: 用gradl ...

  4. ARM 开发板嵌入式linux系统与主机PC通过串口传输文件

    本文转载自http://useless20.blog.163.com/blog/static/237409982010227127576/ 嵌入式linux系统与主机通过串口传输文件 我想如果要从PC ...

  5. HDU-2126 Buy the souvenirs

    数组01背包. http://acm.hdu.edu.cn/showproblem.php?pid=2126 http://blog.csdn.net/crazy_ac/article/details ...

  6. cmd命令行设置环境变量

    http://blog.sciencenet.cn/blog-51026-566742.html 1.查看当前所有可用的环境变量:输入 set 即可查看. 2.查看某个环境变量:输入 “set 变量名 ...

  7. unity3d 制造自己的水体water effect(一)

    first,I wish you a happy new year, and study in spring festival’s eve means you are hardworking,haha ...

  8. NOI题库7624 山区建小学(162:Post Office / IOI2000 POST OFFICE [input] )

    7624:山区建小学 Description 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为 ...

  9. [git] git 的基本认知

    版本管理 ( Version Control ) 版本管理系统是一个记录文件变更的系统,让你在一段时间后可以恢复指定版本的文件.版本管理系统大致可分为三类:独立的本地版本管理系统.中心化版本管理系统. ...

  10. Django-RQ首页、文档和下载 - Django 和 RQ 集成 - 开源中国社区

    Django-RQ首页.文档和下载 - Django 和 RQ 集成 - 开源中国社区 Django-RQ 项目实现了 Django 框架和 RQ 消息队列之间的集成.