USE [EUC]
GO
/****** Object:  StoredProcedure [dbo].[SP_SME_QueryAuditLog]    Script Date: 02/05/2015 15:54:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[SP_SME_QueryAuditLog]
(
    @ReferenceTable VARCHAR(50),
    @ReferenceNumber NVARCHAR(100)
)
AS
BEGIN
     DECLARE @NodeName VARCHAR(50);
    DECLARE @NodeValue NVARCHAR(500);
    DECLARE @NodePreValue NVARCHAR(500);
    DECLARE @LogId uniqueidentifier;
    DECLARE @LogXml xml;
    DECLARE @ProcessDate datetime;
    DECLARE @PreLogXml xml;
    DECLARE @OperationLog NVARCHAR(4000);
    DECLARE @FirstLogId uniqueidentifier;
    DECLARE @FirstOperationLog NVARCHAR(4000);
    DECLARE @FirstLogXml xml;
    DECLARE @Table NVARCHAR(50);
    set @Table=(case when @ReferenceTable='T_SME_CustInfo' then 'Customer Info' when @ReferenceTable='T_SME_IDExpiry' then 'ID Expiry'
                     when @ReferenceTable='T_SME_AC' then 'Account Info' when @ReferenceTable='T_SME_ParmACType' then 'Account Type'
                     when @ReferenceTable='T_SME_ParmCorpType' then 'Corporation Type' when @ReferenceTable='T_SME_ParmCountryCurrency' then 'Country Currency'
                     when @ReferenceTable='T_SME_ParmIDType' then 'ID Type'    when @ReferenceTable='T_SME_ParmMultiCountry' then 'Multiple Country Type'
                     when @ReferenceTable='T_SME_ParmSettleType' then 'Settle Type' when @ReferenceTable='T_SME_ParmSpecialZone' then 'Special Zone Type'
                     when @ReferenceTable='T_SME_ParmTranType' then 'Transaction Type' when @ReferenceTable='T_SME_ParmRMBSource' then 'RMB Source'
                     when @ReferenceTable='T_SME_ParmBOPCode' then 'BOP Code' when @ReferenceTable='T_SME_ParmFinanceManager' then 'Finance Fanager' end );
    
    SELECT TOP 1 @FirstLogId=LogId,@FirstOperationLog=OperationLog, @FirstLogXml=LogXml
    FROM T_SME_AuditLog t WHERE ReferenceTable=@ReferenceTable AND (ReferenceNumber=@ReferenceNumber or LOWER(ReferenceNumber) = LOWER(@ReferenceNumber))
    ORDER BY ProcessDate

IF (@FirstOperationLog IS NULL OR @FirstOperationLog = '')
    BEGIN
print  @FirstLogId;
        SET @FirstOperationLog = '';
        DECLARE nodename_cursor CURSOR FOR SELECT cast(LogItem.query('fn:local-name(.)') as VARCHAR(50)) as NodeName
        FROM @FirstLogXml.nodes('/LogItem/*') AS T ( LogItem )   
        OPEN nodename_cursor   
        FETCH NEXT FROM nodename_cursor INTO @NodeName   
        WHILE @@FETCH_STATUS = 0   
        BEGIN    
            SELECT  @NodeValue = LogItem.value('(//*[local-name() = sql:variable("@NodeName")])[1]', 'nvarchar(500)')
            FROM @FirstLogXml.nodes('/LogItem') AS T ( LogItem );
            SET @FirstOperationLog = @FirstOperationLog + ' [' + @NodeName + ':] ' + @NodeValue;
            FETCH NEXT FROM nodename_cursor INTO @NodeName  
        END  
        CLOSE nodename_cursor   
        DEALLOCATE nodename_cursor  
        UPDATE T_SME_AuditLog SET OperationLog = @FirstOperationLog WHERE LogId = @FirstLogId;
    End

DECLARE audit_cursor CURSOR FOR SELECT LogId,OperationLog,LogXml,ProcessDate
    FROM T_SME_AuditLog t WHERE ReferenceTable=@ReferenceTable AND (ReferenceNumber=@ReferenceNumber or LOWER(ReferenceNumber) = LOWER(@ReferenceNumber))
    ORDER BY ProcessDate DESC;
    OPEN audit_cursor   
    FETCH NEXT FROM audit_cursor INTO @LogId,@OperationLog,@LogXml,@ProcessDate
    WHILE @@FETCH_STATUS = 0   
    BEGIN   
        IF (@OperationLog IS NULL OR @OperationLog = '')
        BEGIN
            SET @OperationLog = '';
            SELECT TOP 1 @PreLogXml = LogXml
            FROM T_SME_AuditLog t
            WHERE ReferenceTable=@ReferenceTable AND (ReferenceNumber=@ReferenceNumber or LOWER(ReferenceNumber) = LOWER(@ReferenceNumber)) AND ProcessDate<@ProcessDate
            ORDER BY ProcessDate DESC;

DECLARE nodename_cursor CURSOR FOR SELECT cast(LogItem.query('fn:local-name(.)') as VARCHAR(50)) as NodeName
            FROM @LogXml.nodes('/LogItem/*') AS T ( LogItem )   
            OPEN nodename_cursor   
            FETCH NEXT FROM nodename_cursor INTO @NodeName   
            WHILE @@FETCH_STATUS = 0   
            BEGIN    
                SELECT  @NodeValue = LogItem.value('(//*[local-name() = sql:variable("@NodeName")])[1]', 'nvarchar(500)')
                FROM @LogXml.nodes('/LogItem') AS T ( LogItem );
                SELECT  @NodePreValue = LogItem.value('(//*[local-name() = sql:variable("@NodeName")])[1]', 'nvarchar(500)')
                FROM @PreLogXml.nodes('/LogItem') AS T ( LogItem );
                IF (@NodePreValue IS NOT NULL AND @NodePreValue != '')
                BEGIN
                    IF (@NodeValue != @NodePreValue)
                    BEGIN
                        SET @OperationLog = @OperationLog+' ['+@NodeName + ':] '+@NodePreValue+' --> '+@NodeValue;
                     END
                END    
                ELSE
                BEGIN
                    SET @OperationLog = @OperationLog+' ['+@NodeName + ':] Empty --> '+@NodeValue;
                END
                FETCH NEXT FROM nodename_cursor INTO @NodeName  
            END  
            CLOSE nodename_cursor   
            DEALLOCATE nodename_cursor
        END
        UPDATE T_SME_AuditLog SET OperationLog = @OperationLog WHERE LogId = @LogId;
        FETCH NEXT FROM audit_cursor INTO @LogId,@OperationLog,@LogXml,@ProcessDate
    END  
    CLOSE audit_cursor;    
    DEALLOCATE audit_cursor;

SELECT LogId, Operation, OperationStatus, OperationLog, ProcessBy, ProcessDate ,@Table as 'OperationTable'
    FROM T_SME_AuditLog t WHERE ReferenceTable=@ReferenceTable AND (ReferenceNumber=@ReferenceNumber or LOWER(ReferenceNumber) = LOWER(@ReferenceNumber))
    ORDER BY ProcessDate DESC;

END

Sql Cursor example的更多相关文章

  1. SQL Cursor生命周期

      阅读导航 1 Cursor Step 1.1 Create cursor 1.2 Parse statement 1.3 descript and define 1.4 Bind variable ...

  2. SQL Cursor 基本用法

     1 table1结构如下  2 id    int  3 name  varchar(50)  4   5 declare @id int  6 declare @name varchar(50) ...

  3. sql Cursor的用法

    table1结构如下 id int name ) declare @id int ) declare cursor1 cursor for --定义游标cursor1 select * from ta ...

  4. 游标SQL Cursor 基本用法

    http://www.cnblogs.com/Gavinzhao/archive/2010/07/14/1777644.html 1 table1结构如下 2 id    int 3 name  va ...

  5. SQL Cursor 基本用法[用两次FETCH NEXT FROM INTO语句?]

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...

  6. SQL CURSOR

    SET NOCOUNT ON; DECLARE @vendor_id int, @vendor_name nvarchar(50),     @message varchar(80), @produc ...

  7. SQL Cursor 游标的使用

    DECLARE @name VARCHAR(50)  --声明游标 DECLARE cursor_VAA1 CURSOR FOR SELECT VAA05 FROM VAA1 --打开游标 OPEN ...

  8. SQL Cursor(游标)

    1.游标在数据表没有id(identity(1,1))时好用,但是游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量 2.如果能不用游标,尽量不要使用游标,用完用完之后一定要 ...

  9. android sql Cursor

    Cursor 是每行的集合. 使用 moveToFirst() 定位第一行. 你必须知道每一列的名称.你必须知道每一列的数据类型.Cursor 是一个随机的数据源. 所有的数据都是通过下标取得. Cu ...

随机推荐

  1. Linq To SQL 的问题点滴

    String 类型的字段问题 String类型的字段生成的SQL 没有判断为空的情况时 生成的SQL: 这里判断为空的逻辑很明显不是本来的意思.   左关联 SQL关联中经常会用到左关联,那么Linq ...

  2. Apache服务停止:信号灯超时时间已到,指定的网络名不再可用

    环境说明:Apache2.4.10,Windows Server 2008 R2 问题说明: apache服务用于下载文件,但是在运行一段时间后,突然挂了. 其错误提示如下所示: [error] (7 ...

  3. Windows下虚拟机安装Ubuntu15.10 Destop简易操作过程

    一.前提环境: 1.vmware12.1,若您的系统是32位,请使用vmware10以下版本. 2.至少双核处理器,2G以上可用内存. 3.Ubuntu安装包(.iso后缀). 注:请尽量支持正版. ...

  4. BenUtils组件和DbUtils组件

    BenUtils组件和DbUtils组件 [TOC] 1.BenUtils组件 1.1.简介 程序中对javabean的操作很频繁,所有Apache提供了一套开源api,方便javabean的操作!即 ...

  5. idea 插件的使用 进阶篇

    CSDN 2016博客之星评选结果公布    [系列直播]零基础学习微信小程序!      "我的2016"主题征文活动   博客的神秘功能 idea 插件的使用 进阶篇(个人收集 ...

  6. [No0000A4]DOS命令(cmd)批处理:替换字符串、截取字符串、扩充字符串、获取字符串长度

    1.替换字符串,即将某一字符串中的特定字符或字符串替换为给定的字符串.举例说明其功能:========================================= @echo off set a ...

  7. Dapper学习笔记(一)

    https://github.com/StackExchange/dapper-dot-net Dapper是对IDbConnection的扩展,需要使用Dapper提供的扩展只需要把SqlMappe ...

  8. C#之发送邮件【模板】+【封装】ZJ版

    PS: 为了弥补上篇博客的不足,正好周六闲着没事.所以进行优化下,来个终结版 功能实现:模板发送+自指定邮箱发送+解耦 总体预览如下: 各代码如下:(代码略多,所以都折叠了) 前台; @{ Layou ...

  9. C语言学习 第八次作业总结

    本次作业其实没有新的内容,主要就是复习上一次的一维数组的相关内容.冯老师布置了5道题目,其中涉及到一些比较简单的排序或者是查找的方法.因为数据很少,所以直接使用for循环遍历就可以了. 关于本次作业, ...

  10. 第五次团队作业——第一次项目冲刺——Alpha版本

    Deadline:2016-11-19    8:00am 本次团队作业将持续三周时间,完成项目Alpha版本,在2016.11.19 的实践课上进行演示操作. 阅读或再次阅读<构建之法> ...