SQL Server雙層游標巢狀

2022-05-11 13:11:05 字數 3618 閱讀 3672

在工作中解決乙個問題,想到用雙層游標巢狀來解決,我知道這個效率低,可沒想到好的解決辦法。。。

下面貼出原始碼記錄一下吧

--

1.需要傳入的變數 tb_bill.dt_dealdate1 tb_bill.dt_dealdate2 tb_draftbill.s_draftor

create

proc

myprocjian

--@sname varchar(100),

@dt_dealdate1

date,

@dt_dealdate2

date,

@s_draftor

varchar(10

),@isright

int output --

傳出引數

as--

1.在賬單表中找出符合條件的s_billnum,用s_billnum在tb_draftbill表中找出有多條資料的,取出這些資料的tb_draftbill.n_dbillid。

--再用tb_draftbill.n_dbillid去表tb_dbilllist查出對應的資料 取到tb_dbilllist.n_cstatusfeeid

--用這個tb_dbilllist.n_cstatusfeeid 去表 tb_billlist 中查對應的資料 ,取出資料中的**費 n_attrfee,將之減去。

declare

@jianattfee

int--

記錄要減去的總**費

declare

@mycount

int--

s_billnum在tb_draftbill表中找出有多條資料的的個數

set@jianattfee=0

declare

@s_billnum sysname --

賬單號declare

@tempjian

int--

單個賬單號對應的臨時要減去的值

declare

@n_dbillid sysname --

tb_draftbill表的主鍵

declare my_cursor cursor

for--

宣告主游標

select

distinct tb_bill.s_billnum from

tb_bill

inner

join tb_billlist on tb_bill.n_billid =

tb_billlist.n_billid

inner

join tb_draftbill on tb_bill.s_billnum =

tb_draftbill.s_billnum

where tb_bill.dt_dealdate >=

@dt_dealdate1

--'2016-12-01 00:00:00'

and tb_bill.dt_dealdate <=

@dt_dealdate2

--'2016-12-31 23:59:59'

and tb_draftbill.s_draftor like

@s_draftor

--'%孫威龍%'

open

my_cursor

fetch

next

from

my_cursor

into

@s_billnum

while(@@fetch_status=0

)begin

set@mycount

=(select

count(*) from (select tb_draftbill.n_dbillid from tb_draftbill where tb_draftbill.s_billnum like

@s_billnum

)t)

if(@mycount

>

1) --

如果是有多個撰寫人

begin

declare my_cursor2 cursor

for--

宣告子游標

select tb_draftbill.n_dbillid from tb_draftbill where tb_draftbill.s_billnum like

@s_billnum

and tb_draftbill.s_draftor not

like

@s_draftor

--'%孫威龍%'

open

my_cursor2

fetch

next

from

my_cursor2

into

@n_dbillid

while(@@fetch_status=0

)

begin

set@tempjian

= (select

sum(tb_billlist.n_attrfee) from tb_billlist inner

join tb_dbilllist on tb_billlist.n_cstatusfeeid =

tb_dbilllist.n_cstatusfeeid

inner

join tb_draftbill on tb_draftbill.n_dbillid =

tb_dbilllist.n_dbillid

where

@mycount

>

1and tb_draftbill.n_dbillid =

@n_dbillid

)

set@jianattfee

=@jianattfee

+@tempjian

fetch

next

from

my_cursor2

into

@n_dbillid

endclose my_cursor2 --

關閉子游標

deallocate

my_cursor2

set@mycount=0

--將乙個賬單號對應的資料數再次設定為0

endelse

begin

set@mycount=0

endfetch

next

from my_cursor into

@s_billnum

endclose

my_cursor

deallocate

my_cursor

--print @jianattfee

go--

下面開始執行

declare

@jianattfee

intexec myprocjian '

2016-12-01 00:00:00

','2016-12-31 23:59:59

','孫威龍

', @jianattfee

output

--select @jianattfee

print

@jianattfee

sql 雙層游標巢狀

建立儲存資料臨時表 create table temp dep temp depid varchar 50 temp depname varchar 50 temp name varchar 5000 向臨時表中插入前三列資料 insert into temp dep temp depid,temp...

雙層巢狀GridView

展開前效果圖 展開後效果圖 js 此部分最重要 aspx commandargument 繫結 表示可以展開,繫結父gridview中資料的關鍵值 即id runat server onclientclick text 新增 將子gridview放在最後一列的模板中 style display no...

關於游標巢狀

游標巢狀使用時,fetch status的值有時會從內部游標影響到外部的游標,使外部的游標只迴圈一次。這時要檢查游標的使用方法。要先移動游標,然後就開始判斷,為真進行進行業務邏輯處理,然後移動游標,這樣就沒問題了。示例如下 declare 外層游標 open 外層游標 fetch next 提取外層...