看一下我的游标@@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
另外请大家帮我看看我的存储过程的事务、出错、提交,传出参数这样写对吗?
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
...全文
相关推荐
存储过程和游标
(1)编写一个存储过程“某学生某课程考试成绩信息”输入学号和姓名,查询学生的姓名,课程名和考试成绩。 (2)创建存储过程“填班级人数”,根据学生表,修改班级表中的班级人数。
sql全局变量说明_sql_server
关于sql server全局变量的一些应用说明
sql server 全局变量
SQL全局变量: 全局变量是系统预定义的,返回一些系统信息,全局变量以两个at(@)开头。下面是我统计了一些较为常用的变量。
Transact-sql 最常用全局变量
Transact-sql 最常用全局变量 绝对精华 本人私藏许久 如有下载 不胜荣幸
TSQL编程基础.pdf
TSQL编程基础.pdf


疑难问题
