前几天要处理一批数据,发现使用表连接,或者子查询都很难解决客户的需求,所以后来只能使用sql游标,加sql程序块来处理。
我想自己以后用得着。
begin try begin transaction; declare @currentTime datetime; select @currentTime = sysdate from (select Getdate() as sysdate) sys; declare @var_userID int declare @var_currentUserPoint int --当前用户可用积分 declare @var_Total2012Point int --2012年总积分 declare @var_Admin2012Point int --2012管理员调整积分 declare @var_Userd2012Point int --2012使用积分 declare @var_Total2013Point int --2013年总积分 declare @var_Admin2013Point int --2013管理员调整积分 declare @var_Userd2013Point int --2013使用积分 declare @var_currentPoint int --应保留积分 declare @var_cleanPoint int --应扣除积分 declare cursor_user CURSOR FOR select u.UserId, u.Point from UserInfo u where u.DepartmentId=2 and u.DepartmentPropertyId in (4,12)--客户类型工业市场客户、分销商 and u.UserId not in (10000046,10000208,10000209,10000222,10000223) OPEN cursor_user --循环处理积分 FETCH NEXT FROM cursor_user INTO @var_userID, @var_currentUserPoint while @@FETCH_STATUS = 0 begin --2012年总积分 select @var_Total2012Point = isnull(sum(quantity*point),0) from BuyHistory where userid = @var_userID and ( buydate >= '2012-01-01 00:00:00' and buydate <= '2012-12-31 23:59:59') and ProductName !='部门管理员调整积分' --2012管理员调整积分 select @var_Admin2012Point = isnull(sum(quantity*point),0) from BuyHistory where userid = @var_userID and ( buydate >= '2012-01-01 00:00:00' and buydate <= '2012-12-31 23:59:59') and ProductName ='部门管理员调整积分' --2012使用积分 select @var_Userd2012Point = isnull(sum(Quantity*point),0) from RedemptionDetail where RedemptionID in (select RedemptionID from GiftRedemption where userId = @var_userID and statusNumber not In ( '100003','100007') and redemptionDate >= '2012-01-01 00:00:00' and redemptionDate <= '2012-12-31 23:59:59' ) --2013总积分 select @var_Total2013Point = isnull(sum(quantity*point),0) from BuyHistory where userid = @var_userID and ( buydate >= '2013-01-01 00:00:00' and buydate <= '2013-12-31 23:59:59') and ProductName !='部门管理员调整积分' --2013管理员调整积分 select @var_Admin2013Point = isnull(sum(quantity*point),0) from BuyHistory where userid = @var_userID and ( buydate >= '2013-01-01 00:00:00' and buydate <= '2013-12-31 23:59:59') and ProductName ='部门管理员调整积分' --2013 使用积分 select @var_Userd2013Point = isnull(sum(Quantity*point),0) from RedemptionDetail where RedemptionID in (select RedemptionID from GiftRedemption where userId = @var_userID and statusNumber not In ( '100003','100007') and redemptionDate >= '2013-01-01 00:00:00' and redemptionDate <= '2013-12-31 23:59:59' ) -- Add BuyHistory --计算公式 当前可用积分=当前用户积分-(当前总积分-2012年总积分-2012年管理员调整-2013年总积分-2013年调整+2012年使用积分+2013年使用积分) --要扣除的积分 set @var_cleanPoint = @var_currentUserPoint - @var_Total2012Point - @var_Admin2012Point- @var_Total2013Point - @var_Admin2013Point+ @var_Userd2012Point+@var_Userd2013Point if @var_cleanPoint<=0 set @var_cleanPoint =0 --计算要保留积分 set @var_currentPoint = @var_currentUserPoint - @var_cleanPoint -- Add PointAdjust insert BuyHistory( BuyDate, Quantity, ProductName, SubmitDate, Unit, Remark, Point, UserId, Price, Type, TotalPoint ) Values( @currentTime, 1, '部门管理员调整积分', @currentTime, '次', '', -@var_cleanPoint, @var_userID, 0, 100002, -@var_currentUserPoint ) insert PointAdjust( Remark, Point, UserId, AdjustDate ) Values( '管理员调整', -@var_cleanPoint, @var_userID, @currentTime ) -- Update UserInfo update UserInfo set Point = @var_currentPoint where DepartmentId=2 and UserId = @var_userID print @var_userID -- Update UserInfo FETCH NEXT FROM cursor_user INTO @var_userID, @var_currentUserPoint end CLOSE cursor_user DEALLOCATE cursor_user commit transaction; end try begin catch print @@TRANCOUNT -- Rollback any active OR uncommittable transactions before if @@TRANCOUNT > 0 rollback transaction; end catch
相关推荐
本文将通过一个具体的示例来详细介绍如何使用SQL游标,并解释其背后的原理与应用场景。 #### 二、SQL游标的定义与作用 游标允许我们在查询结果集中逐行操作数据,而不是一次性获取所有记录。这对于处理大量数据或...
以下是一个基本的显式游标使用示例: ```sql DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name; var1 datatype1; var2 datatype2; BEGIN OPEN cursor_name; LOOP FETCH cursor_...
例如,在示例中,游标`cur_para`接收一个`varchar2`类型的参数`id`,并根据该参数查询`books_name`。 5. **使用FOR循环的游标**: 在示例3中,使用`FOR`循环简化了游标处理。在这种情况下,无需显式调用`OPEN`、`...
1. **声明游标**:使用`DECLARE`语句声明一个游标,并指定该游标将执行的SQL查询语句。 2. **打开游标**:使用`OPEN`语句打开游标,使系统准备执行查询并获取第一行数据。 3. **从游标中获取数据**:使用`FETCH`语句...
本文主要探讨了在SQL Server 2000中如何利用游标处理数据,并通过一个具体的示例来展示游标的使用方法。 #### 核心知识点解析 ##### 1. 游标简介 在SQL Server 2000中,游标是一种用于处理结果集中的行的机制。它...
1. **声明游标**:首先,我们需要声明一个游标,指定其返回的数据源、游标类型、是否可滚动以及默认值。 ```sql DECLARE @myCursor CURSOR; SET @myCursor = CURSOR FORWARD_ONLY STATIC FOR SELECT * FROM ...
在"插入用户.sql"这个文件中,可能包含了一个使用游标的脚本,用于逐条处理用户数据并插入到某个用户表中。这可能是一个批量插入操作,特别是在没有批量插入功能或为了确保插入顺序时非常实用。例如,假设我们有一个...
除了基本的游标使用,例子中还展示了一个更复杂的场景,创建了两个临时表`#Temp1`和`#Temp2`,然后通过游标来合并数据。在游标操作中,如果`#Temp2`已经存在与当前`#Temp1`中`deptid`相同的记录,那么就在`#Temp2`的...
这里,`d_cursor`被定义为一个游标,用于从`Members`表中选择`IdCardNO`列的数据。 #### 二、打开游标 在声明了游标之后,我们需要通过`OPEN`命令来激活游标,使其准备好读取数据。打开游标的语法为: ```sql ...
游标 ms sql 例子----- 大概模式 临时表使用等-——---
sqlserver游标的写法例子,sqlserver游标的写法例子,
游标嵌套是指在一个游标内部使用另一个游标,这在处理复杂的数据逻辑时非常有用。例如,你可以先遍历一个表,然后对每个记录再进行更复杂的子查询。嵌套游标需谨慎使用,因为它们可能导致性能下降,尤其是在处理大量...
以下是一个简单的游标声明和使用的例子: ```sql DECLARE -- 声明变量来存储游标结果 v_emp_id NUMBER; v_emp_name VARCHAR2(50); -- 定义游标 CURSOR emp_cursor IS SELECT employee_id, first_name FROM ...
本文将通过一个具体的SQL游标的使用示例来深入探讨其工作原理及应用技巧。 #### 二、游标概念概述 游标(Cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以通过...
在VB(Visual Basic)编程中,连接SQL数据库并利用...总结,VB通过ADO连接SQL数据库,使用游标可以高效处理结果集,而存储过程则能提升性能和安全性。理解并熟练运用这些技术,对于任何VB开发者来说都是至关重要的。
SQL游标是数据库管理系统中一个重要的概念,尤其在SQL Server中,它允许用户按需处理数据集中的每一行。游标提供了对结果集的前进、后退、读取和修改等操作的能力,使得程序员可以逐行处理数据,而不仅仅是一次性...
在这个例子中,我们首先创建一个名为`PROC_STU1`的过程,它包含一个明确游标`cur_stu`,用于查询`STUDENT`表中的学生编号和姓名,并按照学生编号排序。然后,我们使用`WHILE`循环来遍历游标中的每一行数据,并打印...
根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...