当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQLServer 2008 Merge语句的OUTPUT功能

MSSQL
用SQL创建数据库
无法用TCP/IP协议连接远端SQL Server数据库问题
SQL Server中各个系统表的作用
SQL中的五种数据类型
使用Sql server进行分布式查询
使用sql server中的全文索引
T-SQL 查询中使用的函数之系统函数
SQL 的一些核心语句
缩小SQL Server数据库日志
怎样配置SQL Server发送电子邮件
无数据库日志文件恢复数据库方法两则(1)
无数据库日志文件恢复数据库方法两则(2)
恢复SQL Server系统数据库
利用事务日志来恢复Update、Delete误操作引起的数据丢失
问:如何将 XML 文件导入 SQL Server 2000?
关于SQL Server中几个未公布的访问注册表的扩展存储过程
SQL Server安全规划全攻略
SQL注入漏洞全接触--入门篇(一)
SQL注入漏洞全接触--入门篇(二)
SQL注入漏洞全接触--进阶篇(一)

MSSQL 中的 SQLServer 2008 Merge语句的OUTPUT功能


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 147 ::
收藏到网摘: n/a

SQL Server 2005中的Output功能可以把Insert,Update和Delete的内容都返回,2008中的Output同样具有此功能 下面介绍一下把Output同2008的新T-SQL语句Merge组合使用的方法:
新建下面表:
复制代码 代码如下:

CREATE TABLE Book(
ISBN varchar(20) PRIMARY KEY,
Price decimal,
Shelf int)
CREATE TABLE WeeklyChange(
ISBN varchar(20) PRIMARY KEY,
Price decimal,
Shelf int)
CREATE TABLE BookHistory(
Action nvarchar(10),
NewISBN varchar(20),
NewPrice decimal,
NewShelf int,
OldISBN varchar(20),
OldPrice decimal,
OldShelf int,
ArchivedAt datetime2)

SQL语句为
复制代码 代码如下:

MERGE Book AS B
USING WeeklyChange AS WC
ON B.ISBN = WC.ISBN
WHEN MATCHED AND (B.Price <> WC.Price OR B.Shelf <> WC.Shelf) THEN
UPDATE SET B.Price = WC.Price, B.Shelf = WC.Shelf
WHEN NOT MATCHED THEN
INSERT VALUES(WC.ISBN, WC.Price, WC.Shelf)
OUTPUT $action, inserted.*, deleted.*, SYSDATETIME()
INTO BookHistory;

结果集为:
SELECT * FROM BookHistory
GO
Action NewISBN NewPrice NewShelf OldISBN OldPrice OldShelf ArchivedAt
------ ------- -------- -------- ------- -------- -------- ---------------------------
UPDATE A 101 1 A 100 1 2007-11-25 14:47:23.9907552
INSERT C 300 3 NULL NULL NULL 2007-11-25 14:47:23.9907552
这里有Insert和Update两种Output情况。如果只需要其中一种,可以用下面这种方法过滤:
复制代码 代码如下:

INSERT INTO Book(ISBN, Price, Shelf, ArchivedAt)
SELECT ISBN, Price, Shelf, GETDATE() FROM
(MERGE Book AS B
USING WeeklyChange AS WC
ON B.ISBN = WC.ISBN AND B.ArchivedAt IS NULL
WHEN MATCHED AND (B.Price <> WC.Price OR B.Shelf <> WC.Shelf) THEN
UPDATE SET Price = WC.Price, Shelf = WC.Shelf
WHEN NOT MATCHED THEN
INSERT VALUES(WC.ISBN, WC.Price, WC.Shelf, NULL)
OUTPUT $action, WC.ISBN, Deleted.Price, Deleted.Shelf
) CHANGES(Action, ISBN, Price, Shelf)
WHERE Action = 'UPDATE';