日期:2014-05-18  浏览次数:20402 次

在存储过程中 报 名为 'mycursor' 的游标已存在
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[jzl_getFrequentChangeStatus]
@area int,
@mjno varchar(20)
as
declare @cnt int,@index int, @sta_id varchar(50),@sta_id1 varchar(50),@pos_id varchar(50),@pos_id1 varchar(10),@begin_time datetime
declare @taskno varchar(20)

IF EXISTS (SELECT * from [tempdb].dbo.sysobjects WHERE id = object_id(N'[tempdb].[dbo].#mytmp') )
DROP Table #mytmp
CREATE TABLE #mytmp(

[Sta_id] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Begin_time] [datetime] NULL ,
[Pos_id] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Bcch_0] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[taskNo] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[sta_addr] [varchar] (150) COLLATE Chinese_PRC_CI_AS NULL ,
[pos_addr] [varchar] (150) COLLATE Chinese_PRC_CI_AS NULL ,
 


if @area=-1 and @mjno='all'
begin
--print '1'
declare mycursor scroll cursor for
select sta_id,pos_id,begin_time,taskno from test_bcchmsg order by rtrim(sta_id)+rtrim(pos_id),begin_time desc
select @cnt = count(*) from(select * from test_bcchmsg) a
end
else if @area>-1 and @mjno='all'
begin
declare mycursor scroll cursor for
select a.sta_id,a.pos_id,a.begin_time,a.taskno from test_bcchmsg a inner join share_setting b on(a.sta_id=b.sta_id)
where b.area = @area
order by rtrim(a.sta_id)+rtrim(a.pos_id),a.begin_time desc
select @cnt = count(*) from
(select a.* from bcch_testmsg a inner join share_setting b on(a.sta_id=b.sta_id)
where b.area = @area) a
end
else if @mjno<>'all'
begin
declare mycursor scroll cursor for
select a.sta_id,a.pos_id,a.begin_time, a.taskno from test_bcchmsg a inner join share_setting b on(a.sta_id=b.sta_id)
where a.sta_id=@mjno
order by rtrim(a.sta_id)+rtrim(a.pos_id),a.begin_time desc
select @cnt = count(*) from
(select a.* from bcch_testmsg a inner join share_setting b on(a.sta_id=b.sta_id)
where a.sta_id=@mjno) a
end

open mycursor
if ( @@CURSOR_ROWS > 0 )  
begin
set @index = 1
set @sta_id1 = ''
set @pos_id1 = ''
FETCH first FROM mycursor into @sta_id,@pos_id,@begin_time,@taskno

WHILE @@FETCH_STATUS = 0
BEGIN
--if @sta_id1<>@sta_id or @pos_id1 <> @pos_id
begin
set @sta_id1 = @sta_id
set @pos_id1 = @pos_id

insert into #mytmp
select a.sta_id,a.begin_time,a.b_count,a.fretime,a.pos_id,a.bcch,
  a.taskno,b.main_addr,f.addr

from test_bcchmsg a inner join share_setting b on(a.sta_id=b.sta_id)
inner join child_setting f on( a.sta_id=f.sta_id and a.pos_id=f.pos_id )
   
where a.sta_id=@sta_id and a.pos_id=@pos_id and begin_time=@begin_time and taskno=@taskno


   

set @index = @index+1
if @index >@cnt break 
end
FETCH next from mycursor into @sta_id,@pos_id,@begin_time,@taskno

end
end
close mycursor
deallocate mycursor
 select * from #mytmp
 DROP Table #mytmp

------解决方案--------------------
SQL code
--> 看错,没有嵌套游标,改为本地游标,不然存储过程并发就会出现这个问题:

declare @mycursor cursor

set  @mycursor = cursor scroll for
select sta_id,pos_id,begin_time,taskno from test_bcchmsg order by rtrim(sta_id)+rtrim(pos_id),begin_time desc

--> 其他自己改改。