SQL server 存储过程报错中途停止,如何报错继续执行?

albert_skynet 2010-03-15 10:00:45

create procedure [dbo].[YMTXPro]
as
declare @ExecSql varchar(500)
--连接到oracle数据库

set @ExecSql='exec sp_addlinkedserver ''ora'',''oracle'',''msdaora'',''bssyz'''
exec(@ExecSql)
set @ExecSql='exec sp_addlinkedsrvlogin ''ora'',''false'',''sa'',''intf_ymtx'',''intf_ymtx_1203'''
exec(@ExecSql)

set @ExecSql='select * into bss.dbo.bss_no_del_zjmd1 from ora..LRPT.BSS_NO_DEL_ZJMD'
exec(@ExecSql)
set @ExecSql='select * into bss.dbo.interface_ymtx1 from ora..BSSQRY.INTERFACE_YMTX_VIEW'
exec(@ExecSql)

............

set @ExecSql='exec sp_dropserver ''ora'',''droplogins'''
exec(@ExecSql)

GO



数据库SQL SERVER 2000

BSS_NO_DEL_ZJMD表和INTERFACE_YMTX_VIEW视图',如果不存在执行存储过程报错退出,后面的语句也不执行了,
1.如何判断oracle库中存不存在BSS_NO_DEL_ZJMD表和 INTERFACE_YMTX_VIEW视图?
2.SQL SERVER 2000如何容错,类似try catch 一类的,可以捕捉错误,继续往下执行
...全文
1622 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
albert_skynet 2010-03-15
  • 打赏
  • 举报
回复
8#的方法可以,想在看看还有没有其它的办法
sql_sf 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 albert_skynet 的回复:]
try catch 表不存在还是捕获不到,
oracle 里有个user_tables ,里面存有表名
我使用exec sp_addlinkedserver 登陆以后,查询user_tables,提示表不存在或权限不够,
直接使用oracle 的 SQL PLUS却可以查到,exec sp_addlinkedserver 和SQL PLUS是用同一个用户登陆的
[/Quote]
8#的方法有没有试下
albert_skynet 2010-03-15
  • 打赏
  • 举报
回复
try catch 表不存在还是捕获不到,
oracle 里有个user_tables ,里面存有表名
我使用exec sp_addlinkedserver 登陆以后,查询user_tables,提示表不存在或权限不够,
直接使用oracle 的 SQL PLUS却可以查到,exec sp_addlinkedserver 和SQL PLUS是用同一个用户登陆的
永生天地 2010-03-15
  • 打赏
  • 举报
回复
feixianxxx 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sql_sf 的回复:]
SQL code
go
begin try
select 1/0
end try
begin catch
print N'除数不能为0'
end catch
go
begin try
select * from sssss --无法捕获的错误
end try
begin catch
print N'表不存'
end catch
/*
--------……
[/Quote]
sql_sf 2010-03-15
  • 打赏
  • 举报
回复
go
begin try
select 1/0
end try
begin catch
print N'除数不能为0'
end catch
go
begin try
select * from sssss --无法捕获的错误
end try
begin catch
print N'表不存'
end catch
/*
-----------

(0 個資料列受到影響)

除数不能为0
訊息 208,層級 16,狀態 1,行 2
無效的物件名稱 'sssss'。

*/
sql_sf 2010-03-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fredrickhu 的回复:]
SQL code
2005的
---raiserror的用法
begin try
raiserror('生成一个错误消息',11,1)
end try
begin catch
select error_message() as 错误消息,
error_severity() as严重级别,
error_state() as state;
……
[/Quote]
具体还是要看错误的严重级别
try
catch
只是2005多的一个处理方式

--小F-- 2010-03-15
  • 打赏
  • 举报
回复
2005的
---raiserror的用法
begin try
raiserror('生成一个错误消息',11,1)
end try
begin catch
select error_message() as 错误消息,
error_severity() as严重级别,
error_state() as state;
end catch
ChinaJiaBing 2010-03-15
  • 打赏
  • 举报
回复

----oracle下叛断一个对象是否存在

DECLARE
n INT;
BEGIN
select count(1)
into n
from user_objects
where object_name='YOUROBJECT';
IF n>0 THEN
--存在
...;
ELSE
--不存在
...;
END IF;
END;

alfred_2006 2010-03-15
  • 打赏
  • 举报
回复
如果是2005,可以使用try...catch...,但是,严重级别是9以内的(这个我有点忘记了)是一遇到就整个停止,是没法捕获的
sql_sf 2010-03-15
  • 打赏
  • 举报
回复
因为
被调用的存储过程发生严重错误时,
调用它的存储过程可以捕获错误,并可以继续执行下去
sql_sf 2010-03-15
  • 打赏
  • 举报
回复
楼主可以考虑将
-1 可以会出错的语句放到一个存储过程中
create proc proc_name
as
declare @ExecSql varchar(500)
--连接到oracle数据库
set @ExecSql='exec sp_addlinkedserver ''ora'',''oracle'',''msdaora'',''bssyz'''
exec(@ExecSql)
set @ExecSql='exec sp_addlinkedsrvlogin ''ora'',''false'',''sa'',''intf_ymtx'',''intf_ymtx_1203'''
exec(@ExecSql)
set @ExecSql='select * into bss.dbo.bss_no_del_zjmd1 from ora..LRPT.BSS_NO_DEL_ZJMD'
exec(@ExecSql)
set @ExecSql='select * into bss.dbo.interface_ymtx1 from ora..BSSQRY.INTERFACE_YMTX_VIEW'
exec(@ExecSql)
--2 在[dbo].[YMTXPro]调用刚才的存储过程
create procedure [dbo].[YMTXPro]
as
exec proc_name
--其他语句
set @ExecSql='exec sp_dropserver ''ora'',''droplogins'''
exec(@ExecSql)


sql_sf 2010-03-15
  • 打赏
  • 举报
回复
不是严重的错误,SQL会执行下去
如果严重的错误,SQL不会执行下去
Yang_ 2010-03-15
  • 打赏
  • 举报
回复
2005有Try catch
2000只能@@error判断,不过对象不存在问题估计@@error判断不了,因为直接报错退出了

oracle应该有查询对象是否存在的方法,你查询后,有的才执行,不就容错了吗
albert_skynet 2010-03-15
  • 打赏
  • 举报
回复
@@error也没有往下执行

select '1' from asd
select @@ERROR

消息 208,级别 16,状态 1,第 1 行
对象名 'asd' 无效。
没有显示@@ERROR
albert_skynet 2010-03-15
  • 打赏
  • 举报
回复
@@error也没有往下执行

select '1' from asd
select @@ERROR

消息 208,级别 16,状态 1,第 1 行
对象名 'asd' 无效。
没有显示@@ERROR
--小F-- 2010-03-15
  • 打赏
  • 举报
回复
1. 不懂
2.用@error来处理
obuntu 2010-03-15
  • 打赏
  • 举报
回复


begin try
select 1/0
end try
begin catch
print @@error
print 'sdf'
end
Ny-6000 2010-03-15
  • 打赏
  • 举报
回复
写语句查询相关系统表,


判断所操作的表和视图是否存在了

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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