新版本的数据库中增加了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. 【POJ2778】AC自动机+矩阵乘法

    DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14758 Accepted: 5716 Descrip ...

  2. 如何用python语句获得Python的安装目录

    官方文档上有写的,sys.executable是当前Python解释器(或者其他Python实现)的路径去掉后面一个路径分隔符(Windows下是'\')后的部分即可 >>>impo ...

  3. Executors常用的创建ExecutorService的几个方法说明

    一.线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池. new ThreadPoolExecutor(corePoolSize, maximumPoolSize, kee ...

  4. Bootstrap 3 兼容 IE8 浏览器

    公司新上的项目,前端用的Bootstrap3的框架,但它已经放弃对IE9下的支持了.可IE8还是有着许多用户,不能不照顾到他们,IE7以下的,我只想说,现在什么年代了,要解放思想,与时俱进啊,就不能动 ...

  5. HDU 3480 Division(斜率优化+二维DP)

    Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others) Tota ...

  6. UILabel的使用方法

    UILabel 就是一个显示文字的控件,可以设置文字的各种属性. 构造方法:     //通过设置Label的边框来初始化UILabel     labelOfSlider = [[UILabelal ...

  7. XML文档部署到Tomcat服务器上总是加载出错

    config.xnl 起初文档路径是在src/Dao/config.xml 在Dao目录下BaseDao类中,解析config.xml文件路径 path="/Dao/config.xml&q ...

  8. Java正则表达式(1)

    String类的三个内建正则表达式工具: 1.matches()方法 示例:检查一个句子是否以大写字母开头,以句号结尾 public static boolean checkFormat(String ...

  9. SonarQube4.4+Jenkins进行代码检查实例之二

    SonarQube4.4+Jenkins进行代码检查实例之二 SonarQube4.4+Jenkins进行代码检查实例之二

  10. Java GC专家系列4:Apache的MaxClients设置及其对Tomcat Full GC的影响

    本文是GC专家系列中的第四篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种GC ...