看一下我的游标@@CURSOR_ROWS,怎么返回-1啊
这是我的存储过程,调试的时候,发现@@CURSOR_ROWS总是-1,可是我那条sql语句单独查找,有7条记录的,求教。
另外请大家帮我看看我的存储过程的事务、出错、提交,传出参数这样写对吗?
CREATE PROCEDURE sp_event_autopm
@nRc VARCHAR(1) OUTPUT, -- 返回ID(0-成功;1-错误)
@sMsg VARCHAR(128) OUTPUT -- 返回信息
AS
-- 变量定义
declare @v_eventid varchar(9); -- 事件ID
declare @v_dqrq varchar(6); -- 当前日期(yymmdd)
declare @v_sjxl varchar(3); -- 事件序列
declare @v_azbh varchar(10); -- 安装单编号
declare @v_jqbh varchar(20); -- 机器编号
BEGIN
BEGIN TRAN tt
-- 定义游标
declare cur_event_autopm cursor for select sazbh,sjqbh from z_machine_info where sjqzt='0' and
cast(sxjsj as int)-cast(convert(char(8),getdate(),112) as int)<=7;
-- 打开游标
open cur_event_autopm;
-- 如游标记录数为0,则退出该游标
IF @@CURSOR_ROWS = 0 GOTO END_cur_event_autopm
DECLARE @I INT
DECLARE @J INT
SELECT @I=0
while @I < @@CURSOR_ROWS
begin
IF @I=0
fetch FIRST from cur_event_autopm into @v_azbh,@v_jqbh
ELSE
fetch next from cur_event_autopm into @v_azbh,@v_jqbh
-- 自动生成一个事件ID
select @v_dqrq = substring(convert(char(8),getdate(),112),3,6)
select @v_sjxl = ssjxl from f_system;
select @v_eventid = @v_dqrq + @v_sjxl;
if @v_sjxl = '999'
update f_system set ssjxl='001';
else
update f_system set ssjxl=right('000'+rtrim(ssjxl+1),3);
-- 错误跳出
SELECT @J=@@ERROR
if @j<> 0 GOTO END_cur_event_autopm
-- 根据"安装单编号"来新增一条新的PM事件
insert into z_event(seventid,ssjlb,sjqbh,sazbh,ssjzt,sczry,sczrq)
values(@v_eventid,'3',@v_jqbh,@v_azbh,'1','0001',replace(replace(replace(convert(varchar,getdate(),120),'-',''),':',''),' ',''));
-- 错误跳出
SELECT @J=@@ERROR
if @j<> 0 GOTO END_cur_event_autopm
-- 更新“巡检时间”为加上原巡检时间再加上三个月
update z_machine_info set sxjsj=convert(char(8),dateadd(mm,3,convert(datetime,sxjsj)),112) where sazbh=@v_azbh;
-- 错误跳出
SELECT @J=@@ERROR
if @j<> 0 GOTO END_cur_event_autopm
-- 错误跳出
SELECT @J=@@ERROR
if @j<> 0 GOTO END_cur_event_autopm
--循环递增
SELECT @I=@I+1
end
END_cur_event_autopm:
close cur_event_autopm
DEALLOCATE cur_event_autopm
IF @J=0
BEGIN
COMMIT TRAN tt
set @nRc = 0;
set @sMsg = '触发性PM的自动生成成功!';
RETURN
END
ELSE
BEGIN
ROLLBACK TRAN tt
set @nRc = 1;
set @sMsg = '触发性PM的自动生成发生错误!';
END
END
GO