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