SQL过程异常的捕获

空中猎手 2005-11-23 01:51:21
使用的是SQL SERVER2000
我要实现的功能是,当过程正确执行时返回一个提示正确的字符串,出错时返回一个提示出错的字符串。下面是我的写法:

begin tran
insert into table1 values(....)
if @@error<>0
begin
set @msg = '出错'
select @msg as MESSAGE
rollback
end
set @msg = '成功'
select @msg as MESSAGE
commit tran

但是上面这个方法如果insert出错时就直接中止过程乐,不会执行后面的语句,比如insert一个违返唯一性的记录,或是字段的值类型不正确等。

有什么好的解决方法么?
...全文
273 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ReViSion 2006-03-05
  • 打赏
  • 举报
回复
哈哈,抄过来的
ReViSion 2006-03-05
  • 打赏
  • 举报
回复
错误信息严重级别
错误信息严重级别可用来表明 Microsoft® SQL Server™ 2000 所遇到问题的类型。

严重级别为 10 的信息为信息消息,表明问题是由于输入信息时发生错误而产生的。严重级别为 11 到 16 的错误是由用户产生的,可以由用户修正。

严重级别从 17 到 25 的错误表明软件或硬件错误。当所发生的问题产生严重级别为 17 或更高的错误时,应通知系统管理员。系统管理员必须解析这些错误,并跟踪错误发生的频率。当发生级别为 17、18 或 19 的错误时,尽管某个特定的语句无法执行,但仍可继续。

系统管理员应对能生成严重级别从 17 到 25 的所有问题进行监视,并打印包含信息的错误日志,回找发生错误的位置。

如果问题影响了整个数据库,可以使用 DBCC CHECKDB(数据库)确定损坏的程度。DBCC 可以对必须删除的一些对象进行标识,并有选择地修复损坏。如果损坏范围大,则必须对数据库进行还原。

用 RAISERROR 指定用户定义的错误信息时,使用大于 50,000 的错误信息号以及从 0 到 18 的严重级别。只有系统管理员可以发出严重级别从 19 到 25 的 RAISERROR 错误。

严重级别 0 到 19
严重级别为 10 的错误信息为信息错误。严重级别从 11 到 16 的错误信息由用户生成并可以由用户修正。严重级别为 17 和 18 的错误信息是由资源或系统错误产生的;用户会话不会中断。

使用 sp_addmessage,可以将严重级别从 1 到 25 的用户定义消息添加到 sysmessages。只有系统管理员可以添加严重级别从 19 到 25 的消息。

对于严重级别为 17 和更高的错误信息,应向系统管理员报告。

严重级别 10:状态信息

这是信息消息,表明问题是由于用户输入信息有误而产生的。严重级别 0 在 SQL Server 中是见不到的。

严重级别 11 到 16

这些消息表明错误可由用户修正。

严重级别 17:资源不足

这些消息表明语句导致 SQL Server 用尽资源(如数据库的锁或磁盘空间)或超出了系统管理员设置的一些限制。

严重级别 18:检测到非严重内部错误

这些消息表明存在某种类型的内部软件问题,但语句执行完毕,并且到 SQL Server 的连接还保持着。例如,当 SQL Server 查询处理器在进行查询优化时检测到一个内部错误,则出现严重级别为 18 的消息。每次出现严重级别为 18 的消息时,都应告知系统管理员。

严重级别 19:资源中发生 SQL Server 错误

这些消息表明已超出了 nonconfigurable 内部限制,并且当前批处理终止。严重级别 19 错误很少发生;但是,一旦发生,必须由系统管理员或主要支持提供者修正。每次出现严重级别为 19 的消息时,都应告知系统管理员。

严重级别 20 到 25
严重级别从 20 到 25 表明有系统问题。这是些严重错误,意味着进程(完成语句中指定任务的程序代码)将不再运行。进程在停止前先冻结,记录有关发生内容的信息,然后终止。到 SQL Server 的客户连接将关闭,并且根据存在问题的不同,客户端有可能无法重新连接。

严重级别为 19 或更高的错误信息将停止当前的批处理。严重级别为 20 或更高的错误信息被认为是严重错误,将终止客户连接。此范围的错误信息可能影响数据库中的所有进程,并可能表明数据库或对象损坏。严重级别从 19 到 25 的错误信息均写入错误日志。

严重级别 20:当前进程中的 SQL Server 严重错误

这些消息表明语句遇到了问题。由于该问题所影响的只是当前进程,数据库本身损坏的可能性不大。

严重级别 21:数据库 (dbid) 进程中的 SQL Server 严重错误

这些消息表明遇到了影响当前数据库中所有进程的问题;但数据库本身损坏的可能性不大。

严重级别 22:SQL Server 严重错误表的完整性置疑

这些消息表明消息中所指定的表或索引已因软件或硬件问题而损坏。

严重级别 22 错误很少发生;但是,如果遇到该错误,请运行 DBCC CHECKDB 确定数据库中是否有其它对象也受损坏。问题有可能只存在于超速缓存中,而不是存在于磁盘本身。如果是这样,重新启动 SQL Server 将修正该问题。要继续工作,必须重新连接到 SQL Server。否则,用 DBCC 修复该问题。有些情况下,有必要还原数据库。

如果重新启动帮助不大,则问题存在于磁盘上。有时,摧毁在错误信息中指定的对象可以解决该问题。例如,如果消息说 SQL Server 在非聚集索引中发现长度为 0 的行,删除该索引然后重建。

严重级别 23:SQL Server 严重错误:数据库完整性置疑

这些消息表明由于硬件或软件问题,整个数据库完整性存在问题。

严重级别 23 错误很少发生;但是,如果遇到,请运行 DBCC CHECKDB 确定损坏的程度。问题有可能只存在于超速缓存中,而不是存在于磁盘本身。如果是这样,重新启动 SQL Server 将修正该问题。要继续工作,必须重新连接到 SQL Server。否则,用 DBCC 修复该问题。有些情况下,有必要重新启动数据库。

严重级别 24:硬件错误

这些消息表明某些类型的媒体失败。系统管理员可能必须重新装载数据库。可能还有必要给硬件厂商打电话。

xeqtr1982 2006-03-05
  • 打赏
  • 举报
回复
好像返回的错误等级是16的话,批处理会被立即终止
三面来风 2006-03-05
  • 打赏
  • 举报
回复
是不是该放在事务里面去做?
hiairfly 2006-03-02
  • 打赏
  • 举报
回复
怎样“先判断再执行”???
churchatp1 2005-11-23
  • 打赏
  • 举报
回复
先判断再执行
空中猎手 2005-11-23
  • 打赏
  • 举报
回复
上面打错了,少了一个return

begin tran
insert into table1 values(....)
if @@error<>0
begin
set @msg = '出错'
select @msg as MESSAGE
rollback
return
end
set @msg = '成功'
select @msg as MESSAGE
commit tran

34,576

社区成员

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

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