新版本的数据库中增加了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. EditText的 焦点事件 setOnFocusChangeListener

    实现代码: //光标处在EditText时其内容消失 mInfo = (EditText)findViewById(R.id.old_password); //setOnFocusChangeList ...

  2. c++类型转换Type Cast)

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast, ...

  3. 【HDOJ】2966 In case of failure

    KD树,这东西其实在ML经常被使用,不过30s的时限还是第一次见. /* 2966 */ #include <iostream> #include <string> #incl ...

  4. jqGrid简单介绍

    一.要引用的文件 要使用jqGrid,首先页面上要引入如下css与js文件. 1.css <link href="/css/ui.jqgrid.css" rel=" ...

  5. mac下的改装人生——关于机械键盘

    这几天好像弄了很多关于机械键盘的东西,我自己的这块键盘也已经慢慢熟悉了,感觉打字超级爽哈,然后看了很多网上关于机械键盘的帖子,也看了很多教程,在Amazon和Taobao看了很多键盘的价位,前几天还试 ...

  6. Bzoj 2705: [SDOI2012]Longge的问题 欧拉函数,数论

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1959  Solved: 1229[Submit][ ...

  7. QT静态链接

    想把QT的程序链接成一个独立的EXE以方便使用,查了很多资料都需要自行编译QT. 搜索了很多的资料,发篇写得比较简明一些:http://my.oschina.net/weiweiqiao/blog/2 ...

  8. shiro能做什么,做j2ee时候要考虑什么

    转载: http://jinnianshilongnian.iteye.com/blog/2018398,         感谢原作者 <跟我学Shiro>PDF完结版下载 博客分类: 跟 ...

  9. SQL数据类型介绍

    在计算机中数据有两种特征:类型和长度.所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类.    在SQL Server 中每个变量.参数.表达式等都有数据类型.系统提供的数据类型分为几大类 ...

  10. web项目学习之基于注解的Controller

    1. 低版本Spring MVC 实现Controller 使用过低版本 Spring MVC 的读者都知道:当创建一个 Controller 时,我们需要直接或间接地实现 org.springfra ...