前几天要处理一批数据,发现使用表连接,或者子查询都很难解决客户的需求,所以后来只能使用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
相关推荐
虽然游标能做的事,也可以利用DELPHI的while not qry1.Eof do...来完成,但学学还有有用的。 我想在数据库里实现循环应该比在程序里实现来得快吧? 高手莫入。
全面的 ORACLE + SQL 游标 案例 新手入门必看!
SQL Server2000游标例子 SQL Server2000游标例子
sql server 游标试用方法 例子
游标 ms sql 例子----- 大概模式 临时表使用等-——---
sqlserver游标的写法例子,sqlserver游标的写法例子,
SqlServer存储过程游标 ,一个例子
自己做的存储过程含游标例子,对于初学存储过程和游标的人有帮助
Oracle 一次请求执行多条sql语句 在.net 中查询Sql Server 一次请求执行多条sql语句很...例子中提供了2种解决方案 一种是用游标 还有一种就是很简单的拼接字符串的方法 语法略微和sql server有些区别 适合新手学习
例子: 显示emp表所有雇员名及其工资: 代码如下:declarecursor emp_cursor is select ename,sal from emp ;beginfor emp_record in emp_cursor loopdbms_output.put_line(‘姓名: ‘||emp_record.ename||’ , 工资...
NULL 博文链接:https://modiliany.iteye.com/blog/786230
这是一个关于SQL游标使用的例子,对于初学游标的来说,很不错哦
游标分批取数据例子,sql用
不错的资料,从中可以学习游标的实用技巧。注意例子里游标的使用,是很经典的例子。
2.1 一个嵌入SQL语言的简单例子 5 2.2 嵌入SQL的处理过程 6 2.3 嵌入SQL语句总览 7 2.3.1 宿主变量 7 2.3.2 连接数据库 12 2.3.3 数据的查询和修改 13 2.3.4 游标的使用 13 2.3.5 SQLCA 15 2.3.6 WHENEVER 16 2.3.7 ...
今天在优化工作中遇到的sql慢的问题,发现以前用了挺多游标来处理数据,这样就导致在数据量多的情况下,需要一行一行去遍历从而计算需要的数据,这样处理的结果就是数据慢,容易卡死。 语法介绍: 1、与Row_Number()...
本文举一个简单的例子来比较一些通过For..Loop读取游标和Open..Close的区别。
2.1 一个嵌入SQL语言的简单例子 5 2.2 嵌入SQL的处理过程 6 2.3 嵌入SQL语句总览 7 2.3.1 宿主变量 7 2.3.2 连接数据库 12 2.3.3 数据的查询和修改 13 2.3.4 游标的使用 14 2.3.5 SQLCA 15 2.3.6 WHENEVER 17 2.3.7 ...