在工作中解決乙個問題,想到用雙層游標巢狀來解決,我知道這個效率低,可沒想到好的解決辦法。。。
下面貼出原始碼記錄一下吧
--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
@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 提取外層...