Declare cur_cso cursor for
select cso.f_aspnode,
count(*)
from tabl cso,
tab2 cm
where cso.f_key=cm.f_cso
and cso.f_status = 150
and convert(char(10),cso.F_CloseTime,120) = convert(char(10),@max_date,120)
group by cso.f_aspnode,
having count(*) = 1
在后面open cur_cso后,总是取不到记录!!!,但是我单独拿出来是能够检索出数据的,什么原因?
这个问题第1个回答:
给你看看一个简单的例子
SQL code
declare JobsCursor cursor forward_only
for
select * from jobs where min_lvl=75
open jobscursor
fetch jobscursor
update jobs set max_lvl=100
where current of jobscursor
select * from jobs where min_lvl=75
fetch relative -1 from jobscursor
close jobscursor
deallocate jobscursor
这个问题第2个回答:
楼主最好把整个程序贴出来
还有,1楼的写法肯定是错的
这个问题第3个回答:
好的,帖出来!!!
CREATE PROCEDURE [dbo].[kp_once_solve_rate]
AS
BEGIN
Declare @max_date datetime
Declare @curr_date datetime
Declare @diff_day int
Declare @aspnode bigint
Declare @MaterialProfile bigint
Declare @dateid datetime
Declare @cnt int
Declare @t_fact_once_solve_rate table
(f_aspnode bigint null,
all_qty dec(12,4))
Declare cur_cso cursor for
select cso.f_aspnode,
count(*)
from tab1 cso,
tab2 cm
where cso.f_key=cm.f_cso
and cso.f_status = 150
and convert(char(10),cso.F_CloseTime,120) = convert(char(10),@max_date,120)
group by cso.f_aspnode,
having count(*) = 1
select @max_date = max(Date_id) from [fact_once_solve_rate]
select @curr_date = convert(char(10),Getdate(),120)
select @diff_day = datediff(day,@max_date,@curr_date)
WHILE @diff_day > 0
BEGIN
select @max_date = @max_date + 1
select @diff_day = datediff(day,@max_date,@curr_date)
INSERT INTO @t_fact_once_solve_rate
(f_aspnode
,all_qty)
select f_aspnode,
isnull(count(*),0)
from tab2
where convert(char(10),F_CloseTime,120) = convert(char(10),@max_date,120)
and f_status = 150
and F_CloseTime is not null
group by f_aspnode,
OPEN cur_cso
FETCH NEXT from cur_cso INTO @aspnode,@cnt
WHILE @@FETCH_STATUS = 0 //跟踪这个值的时候总是-1,取不到数据!!!我cursor中的语句肯定能检索出数据
BEGIN
update @t_fact_once_solve_rate
set solve_qty = @cnt
where f_aspnode = @aspnode
FETCH NEXT from cur_cso INTO @aspnode,@cnt
END
CLOSE cur_cso
--清空临时表
delete @t_fact_once_solve_rate
END
END
这个问题第4个回答:
close后为什么不再deallocate捏?
这个问题第5个回答:
当执行Declare cursor时,只是确认游标的select语句,
只有当执行到open语句打开游标时,才真正的执行该select语句来填充游标,
游标的数据持续到close语句为止。
ps:close语句只是删除游标中的数据,并未释放资源;deallocate则删除游标的数据及占用的数据结构。
因此,如果后面不再使用游标,可以deallocate代替close来进行回收。
这个问题第6个回答:
楼上已经说的很清楚了!看看语法吧!可能是语法没有完全搞懂!我经常这样!呵呵!
这个问题第7个回答:
应该是cso.f_key=cm.f_cso
and cso.f_status = 150
and convert(char(10),cso.F_CloseTime,120) = convert(char(10),@max_date,120
这三个条件里有不满足条件的吧。
仔细看下数据。