Sql Cursor example
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的更多相关文章
- SQL Cursor生命周期
阅读导航 1 Cursor Step 1.1 Create cursor 1.2 Parse statement 1.3 descript and define 1.4 Bind variable ...
- SQL Cursor 基本用法
1 table1结构如下 2 id int 3 name varchar(50) 4 5 declare @id int 6 declare @name varchar(50) ...
- sql Cursor的用法
table1结构如下 id int name ) declare @id int ) declare cursor1 cursor for --定义游标cursor1 select * from ta ...
- 游标SQL Cursor 基本用法
http://www.cnblogs.com/Gavinzhao/archive/2010/07/14/1777644.html 1 table1结构如下 2 id int 3 name va ...
- SQL Cursor 基本用法[用两次FETCH NEXT FROM INTO语句?]
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...
- SQL CURSOR
SET NOCOUNT ON; DECLARE @vendor_id int, @vendor_name nvarchar(50), @message varchar(80), @produc ...
- SQL Cursor 游标的使用
DECLARE @name VARCHAR(50) --声明游标 DECLARE cursor_VAA1 CURSOR FOR SELECT VAA05 FROM VAA1 --打开游标 OPEN ...
- SQL Cursor(游标)
1.游标在数据表没有id(identity(1,1))时好用,但是游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量 2.如果能不用游标,尽量不要使用游标,用完用完之后一定要 ...
- android sql Cursor
Cursor 是每行的集合. 使用 moveToFirst() 定位第一行. 你必须知道每一列的名称.你必须知道每一列的数据类型.Cursor 是一个随机的数据源. 所有的数据都是通过下标取得. Cu ...
随机推荐
- Hash 函数及其重要性
不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性.今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码. 申明 密码学 ...
- 关于JS的prototype
在接触JS的过程中,随着理解的深入会逐渐的理解一些比较深奥的理论或者知识,那么今天我们来介绍一下比较难理解的prototype和constructor. 初步理解: 在说prototype和const ...
- FastCgi与PHP-fpm关系
1 CGI (1)什么是CGI: CGI(Common Gateway Interface)公共网关接口, 是WWW技术中最重要的技术之一,有着不可替代的重要地位, CGI是外部应用程序(CGI程序 ...
- tomcat 8.5.9.0 解决catalina.out过大的问题
先吐嘈一下tomcat这个项目,日志切割这么常见的功能,tomcat这种知名开源项目默认居然不开启,生产环境跑不了几天,磁盘就满了,而且很多网上流传的方法,比如修改conf/logging.prope ...
- underscore 源码解读之 bind 方法的实现
自从进入七月以来,我的 underscore 源码解读系列 更新缓慢,再这样下去,今年更完的目标似乎要落空,赶紧写一篇压压惊. 前文 跟大家简单介绍了下 ES5 中的 bind 方法以及使用场景(没读 ...
- 华为5G空口新技术(2015年)
2015-03-24 长江后浪推前浪,4G建设方兴未艾,业界关于5G的讨论已如火如荼.对于每一代移动通信,空口技术都相当于王冠上的明珠. 在月初的世界移动通信大会上,华为发布了面向5G的新空口,并展出 ...
- valueOf和toString的区别
基本上所有的JavaScript数据类型都有valueOf(),toString()方法,null除外,这两个方法解决了JavaScript值运算和显示的问题 valueOf()会把数据类型转换成原始 ...
- hihoCoder太阁最新面经算法竞赛15
hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...
- 使用markdown
一.在windows下使用markdown MarkdownPad:MarkdownPad is a full-featured markdown editor for windows. Awsomi ...
- JavaScript中---作用域
作用域: 变量还有函数作用的范围. 浏览器的内核主要有两大功能,一个是渲染页面,另一个就是我们的JavaScript的解释器了. 我们主要来说说JavaScript解释器,在解析时是怎么样的工作原理. ...