OUTPUT、Merge语句的使用

  新版本的数据库中增加了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

  

原文地址:https://www.cnblogs.com/mfkaudx/p/3503799.html