zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    JAVA联调接口跨域解决办法
    Quartz集成springMVC 的方案二(持久化任务、集群和分布式)
    Quartz集成springMVC 的方案一
    Java 常调用的Webservice接口的方法
    集成Dubbo服务(Spring)
    Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
    事务的隔离级别 数据库
    Spring 之注解事务 @Transactional
    Request To JavaBean(请求对象转换为JavaBean对象)
    springmvc+mongodb+maven 项目搭建配置
  • 原文地址:https://www.cnblogs.com/mfkaudx/p/3503799.html
Copyright © 2011-2022 走看看