游標的使用

2021-05-25 00:57:16 字數 2629 閱讀 1770

use [newsite]

go/****** object:  storedprocedure [dbo].[pro_cutpoint]    script date: 04/21/2011 10:49:16 ******/

set ansi_nulls on

goset quoted_identifier on

goalter procedure [dbo].[pro_cutpoint]

--要扣除的總分數

@sumpoint int,

--表userpointrecord用到的資料

@userid nvarchar(50),--使用者id

--表user_usedpoint用到的資料

@recordtypeid int,

@recordtype nvarchar(1000),

@orderid int,

--表user_pointusehistory用到的資料

@actionid int,

@actionname varchar(50)

as--開啟自動回滾事務

set xact_abort on

begin transaction cuttran

declare cursor_cutpoint scroll cursor

forselect pointrecord_id,point,userpoint from userpointrecord where point>userpoint and userid=@userid and createdate>dateadd(month,-18,getdate()) and isvalid=1 order by createdate asc--某使用者的所有未用完積分的記錄

declare @pointrecord_id int;

declare @point int;

declare @userpoint int;

open cursor_cutpoint

fetch next from cursor_cutpoint into @pointrecord_id,@point,@userpoint

while (@@fetch_status=0)

begin

if(@sumpoint>(@point-@userpoint))--如果要扣除的分數大於當前記錄剩餘的分數

begin

set @sumpoint=@sumpoint-(@point-@userpoint)

update userpointrecord set userpoint=@point where pointrecord_id=@pointrecord_id

if(@@error<>0)

begin

rollback transaction cuttran

endinsert into user_usedpoint values(@recordtypeid,@recordtype,@pointrecord_id,@orderid,-(@point-@userpoint),0,getdate(),1)

if(@@error<>0)

begin

rollback transaction cuttran

endinsert into user_pointusehistory values(@actionid,@actionname,-(@point-@userpoint),@userid,getdate(),@userid,getdate())

if(@@error<>0)

begin

rollback transaction cuttran

endend

else if(@sumpoint<=(@point-@userpoint))

begin

update userpointrecord set userpoint=@sumpoint+@userpoint where pointrecord_id=@pointrecord_id

if(@@error<>0)

begin

rollback transaction cuttran

endinsert into user_usedpoint values(@recordtypeid,@recordtype,@pointrecord_id,@orderid,-@sumpoint,0,getdate(),1)

if(@@error<>0)

begin

rollback transaction cuttran

endinsert into user_pointusehistory values(@actionid,@actionname,-@sumpoint,@userid,getdate(),@userid,getdate())

if(@@error<>0)

begin

rollback transaction cuttran

endbreak

endfetch next from cursor_cutpoint into @pointrecord_id,@point,@userpoint

endclose cursor_cutpoint

deallocate cursor_cutpoint

commit transaction cuttran

游標的使用

declare sql varchar 8000 password varchar 200 密碼 tbname varchar 500 資料庫.dbo.表名,如果不指定 dbo.表名,則匯出資料庫的所有使用者表 filename varchar 1000 匯入 匯出路徑 檔名,如果 tbname引數...

游標的使用

游標 cursor 是處理資料的一種方法,為了檢視或者處理結果集中的資料,游標提供了在結果集中一次以行或者多行前進或向後瀏覽資料的能力。我們可以把游標當作乙個指標,它可以指定結果中的任何位置,然後允許使用者對指定位置的資料進行處理。1.游標的組成 游標包含兩個部分 乙個是游標結果集 乙個是游標位置。...

游標的使用

declare userid varchar 20 將 temp2 值賦給當前游標 declare c getdata cursor forselect userid from temp2 開啟當前游標 並將游標值賦給變數 open c getdata fetch c getdata into us...