SQL里遇错误跳过继续执行的问题

achongsky 2006-06-15 12:19:12
小弟写了一个存储过程如下,过程是从一张表中读取一些数据存入游标变量,然后逐条读取游标中的数据,每读取一条数据后,由这些数据生成一段SQL脚本,然后再exec这段脚本,然后再读取游标的另一条记录,直到游标结束。

现在的问题是:在作业中调这个存储过程的时候遇到错误就中止了,也就是exec由游标生成的那段SQL脚本时,如果遇到错误,游标就不往下走了,但奇怪的是如果我在查询分析器里执行调存储过程的,遇错却能执行下去。

例如:"exec HP_NewExec_Pro 1",在作业中调这个就遇错中止,但在查询分析器里执行就能直到游标结束,该报错的报错,没出错的就显示影响多少行,按道理说在作业中执行和在查询分析器里执行应该是一样的吧,为什么会有这样的差别呢?望高手指点,或者能给我一个好的处理错误继续执行的方法,谢谢大家了。

-------------------存储过程HP_Newexec_Pro-------------------------

CREATE PROCEDURE HP_NewExec_Pro
(
@areaCode as int
)
AS

Declare @DelID as varchar(50),@type as varchar(10),@BaseName as varchar(15)
Declare @TableName as varchar(30),@IDName as varchar(15),@OrderID as varchar(50),@ChangeValue as varchar(8000),@Ctype as varchar(50)
Declare @FieldName as varchar(20),@NewRecord as varchar(8000),@LinkedServer as varchar(50)
Declare @ERR as Varchar(10)
DECLARE mycur_exec CURSOR
for
select Del_ID,Type,BaseName,TableName,IDName,OrderID,FieldName,ChangeValue,Ctype,
case areaCode when 0 then '[192.168.1.250]'
when 1 then '[192.168.2.250]'
when 2 then '[192.168.3.250]'
when 3 then '[192.168.4.250]'
end as Linkedserver
from Newexec..exc_UpdatedPro
where dbs.dbo.fc_Marks(Update__Mark,@areaCode)<>0 and charindex(cast(@areaCode as varchar),Sendarea)<>0
order by Del_Date,type
open mycur_exec
---------------------------------
fetch next from mycur_exec into @DelID,@type,@BaseName,@TableName,@IDname,@OrderID,@FieldName,@ChangeValue,@Ctype,@LinkedServer

while (@@FETCH_STATUS<>-1)
begin

---------------------------------------
IF @Type=1
begin

set @NewRecord='Insert '+@BaseName+'.dbo.'+@TableName+'
select *
from '+@LinkedServer+'.'+@BaseName+'.dbo.'+@Tablename+'
where '+@IDname+'='''+@OrderID+''''
--Print @NewRecord
exec(@NewRecord)
set @Err=@@ERROR
IF @Err<>0
begin
Insert Newexec..exc_ERROR
(
ERROR_ID,ERROR_Code
)
select @DelID,@ERR
end

Update Newexec..exc_UpdatedPro
set Update__Mark=dbs.dbo.fc_markzero(Update__Mark,@areaCode)
where Del_ID=@DelID

end
------------------------------------
--------------------
IF @Type=2
begin

set @NewRecord='Delete '+@BaseName+'.dbo.'+@TableName+'
where '+@IDname+'='''+@OrderID+''''
exec(@NewRecord)
set @Err=@@ERROR
IF @Err<>0

begin
Insert Newexec..exc_ERROR
(
ERROR_ID,ERROR_Code
)
select @DelID,@ERR
end
Update Newexec..exc_UpdatedPro
set Update__Mark=dbs.dbo.fc_markzero(Update__Mark,@areaCode)
where Del_ID=@DelID

end
--------------------
if @Type=3
begin
if @ctype='money'
begin
set @NewRecord='
Update '+@BaseName+'.dbo.'+@TableName+'
set ['+@FieldName+']='+@ChangeValue+',Update__Mark=UPdate__Mark
where '+@IDname+'='''+@OrderID+''''
end
if @ctype<>'money' or @ctype is null
begin
set @NewRecord='
Update '+@BaseName+'.dbo.'+@TableName+'
set ['+@FieldName+']='''+@ChangeValue+''',Update__Mark=UPdate__Mark
where '+@IDname+'='''+@OrderID+''''
end
exec(@NewRecord)
set @Err=@@ERROR
IF @Err<>0

begin
Insert Newexec..exc_ERROR
(
ERROR_ID,ERROR_Code
)
select @DelID,@ERR
end
Update Newexec..exc_UpdatedPro
set Update__Mark=dbs.dbo.fc_markzero(Update__Mark,@areaCode)
where Del_ID=@DelID

end

fetch next from mycur_exec into @DelID,@type,@BaseName,@TableName,@IDname,@OrderID,@FieldName,@ChangeValue,@Ctype,@LinkedServer

end
close mycur_exec
DEALLOCATE mycur_exec
GO
...全文
1637 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
achongsky 2006-06-16
  • 打赏
  • 举报
回复
问题依旧,上去...
wgsasd311 2006-06-15
  • 打赏
  • 举报
回复
我不知道怎样取消作业的整体性(事物性)
achongsky 2006-06-15
  • 打赏
  • 举报
回复
那有什么方法实现在作业中调用时遇错误继续吗?
wgsasd311 2006-06-15
  • 打赏
  • 举报
回复
好像作业是一个整体(即事物),所以如失败就会全部回滚,所以和你直接运行稍有不同。
francsescoli 2006-06-15
  • 打赏
  • 举报
回复
顶。
achongsky 2006-06-15
  • 打赏
  • 举报
回复
回楼上:不是错误级别的问题,只要是错误就会中止。但在查询分析器里执行就不中止,能够执行到游标结束。
laoliu666 2006-06-15
  • 打赏
  • 举报
回复
好象SQL遇到严重错误时会自终止执行
achongsky 2006-06-15
  • 打赏
  • 举报
回复
真的是着急的问题啊,邹老师快来~~~~~~~~~~~~~
coder1 2006-06-15
  • 打赏
  • 举报
回复
帮顶
achongsky 2006-06-15
  • 打赏
  • 举报
回复
麻烦大家再看看,谢谢了。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧