存储过程异常处理
类别:数据库 浏览量:782
时间:2014-7-26 存储过程异常处理
存储过程异常处理一、存储过程使用 try......catch异常处理
TRY 块以 BEGIN TRY 语句开头,以 END TRY 语句结尾。在 BEGIN TRY 和 END TRY 语句之间可以指定一个或多个 Transact-SQL 语句。
CATCH 块必须紧跟 TRY 块。
CATCH 块以 BEGIN CATCH 语句开头,以 END CATCH 语句结尾。
在 Transact-SQL 中,每个 TRY 块仅与一个 CATCH 块相关联。
二、TRY……CATCH基本语法如下
BEGIN TRY
RAISERROR ('Houston, we have a problem', 16,1)
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() as ERROR_NUMBER, //返回错误号。
ERROR_SEVERITY() as ERROR_SEVERITY, //返回错误严重性。
ERROR_STATE() as ERROR_STATE, //返回错误状态号。
ERROR_MESSAGE() as ERROR_MESSAGE //返回错误消息的完整文本。此文本包括为任何可替换参数(如长度、对象名称或时间)提供的值。
ERROR_LINE() as ERROR_LINE, //返回导致错误的例程中的行号。
ERROR_PROCEDURE() as ERROR_PROCEDURE, //返回出现错误的存储过程或触发器的名称。
END CATCH
存储过程错误消息
if (object_id('proc_error_info') is not null)
drop procedure proc_error_info
go
create proc proc_error_info
as
select
error_number() '错误编号',
error_message() '错误消息',
error_severity() '严重性',
error_state() '状态好',
error_line() '错误行号',
error_procedure() '错误对象(存储过程或触发器)名称';
go
用异常处理错误信息
--简单try catch示例
begin try
select 1 / 0;
end try
begin catch
exec proc_error_info; --调用错误消息存储过程
end catch
go
--
--简单try catch示例,无法处理错误
begin try
select * * from student;
end try
begin catch
exec proc_error_info;
end catch
go
--
--简单try catch示例,不处理错误(不存在的表对象)
begin try
select * from st;
end try
begin catch
exec proc_error_info;
end catch
go
--
--异常处理,能处理存储过程(触发器)中(不存在表对象)的错误信息
if (object_id('proc_select') is not null)
drop procedure proc_select
go
create proc proc_select
as
select * from st;
go
begin try
exec proc_select;
end try
begin catch
exec proc_error_info;
end catch
go
异常不能处理编译期的错误,如语法错误。以及重编译造成部分名称对象得不到正确解析的时候所出现的错误。
处理异常日志信息
---异常、错误信息表
if (object_id('errorLog', 'U') is not null)
drop table errorLog
go
create table errorLog(
errorLogID int primary key identity(100, 1), --ErrorLog 行的主键。
errorTime datetime default getDate(), --发生错误的日期和时间。
userName sysname default current_user, --执行发生错误的批处理的用户。
errorNumber int, --发生的错误的错误号。
errorSeverity int, --发生的错误的严重性。
errorState int, --发生的错误的状态号。
errorProcedure nvarchar(126), --发生错误的存储过程或触发器的名称。
errorLine int, --发生错误的行号。
errorMessage nvarchar(4000)
)
go
--
--存储过程:添加异常日志信息
if (object_id('proc_add_exception_log', 'p') is not null)
drop proc proc_add_exception_log
go
create proc proc_add_exception_log(@logId int = 0 output)
as
begin
set nocount on;
set @logId = 0;
begin try
if (error_number() is null)
return;
if (xact_state() = -1)
begin
print '会话具有活动事务,但出现了致使事务被归类为无法提交的事务的错误。'
+ '会话无法提交事务或回滚到保存点;它只能请求完全回滚事务。'
+ '会话在回滚事务之前无法执行任何写操作。会话在回滚事务之前只能执行读操作。'
+ '事务回滚之后,会话便可执行读写操作并可开始新的事务。';
end
else if (xact_state() = 0)
begin
print '会话没有活动事务。';
end
else if (xact_state() = 1)
begin
print '会话具有活动事务。会话可以执行任何操作,包括写入数据和提交事务。';
end
--添加日志信息
insert into errorLog values(getDate(),
current_user, error_number(),
error_severity(), error_state(),
error_procedure(),
error_line(), error_message());
--设置自增值
select @logId = @@identity;
end try
begin catch
print '添加异常日志信息出现错误';
exec proc_error_info;--显示错误信息
return -1;
end catch
end
go
--
---处理异常信息示例
declare @id int;
begin try
begin tran;
--删除带有外键的记录信息
delete classes where id = 1;
commit tran;
end try
begin catch
exec proc_error_info;--显示错误信息
if (xact_state() <> 0)
begin
rollback tran;
end
exec proc_add_exception_log @id output
end catch
select * from errorLog where errorLogID = @id;
go
标签:存储过程
您可能感兴趣
- mysql存储过程声明(MySQL存储过程的深入讲解in、out、inout)
- 怎么写存储过程sql server(SqlServer存储过程实现及拼接sql的注意点)
- sqlserver存储过程怎么写日志(SqlServer快速检索某个字段在哪些存储过程中sql 语句)
- sqlserver 存储过程参数类型(详解SQL Server表和索引存储结构)
- sqlserver存储过程同步数据(SQL Server存储过程同时返回分页结果集和总数)
- sqlserver存储过程使用变量(浅析SQL Server的嵌套存储过程中使用同名的临时表怪像)
- sqlserver数据库中锁的4种类型(SQLSERVER对加密的存储过程、视图、触发器进行解密推荐)
- mybatis执行sql源码解析(mybatis调用sqlserver存储过程返回结果集的方法)
- SQL SERVER存储过程中使用事务与try catch
- mssql 存储过程查询语句(MSSQL分页存储过程完整示例支持多表分页存储)
- sqlserver存储过程参数默认值(sql server使用临时存储过程实现使用参数添加文件组脚本复用)
- 存储过程异常处理
- mysql存储过程定义表(MySQL存储过程的创建、调用与管理详解)
- 存储过程中如何获取错误信息
- Sql Server判断函数、存储过程等是否存在
- mysql中常用的三种存储引擎的区别(MySQL 存储过程的优缺点分析)
- 辱华品牌新百伦官宣新代言人IU,个别粉丝希望get爱豆同款(辱华品牌新百伦官宣新代言人IU)
- 巅峰时期被爆床照,曾被选国民最讨厌女星,IU不为人知的黑历史(巅峰时期被爆床照)
- 每天1万吨牛奶倒进下水道,美国大萧条一幕重现(每天1万吨牛奶倒进下水道)
- 如何看待美国数十万加仑牛奶倒下水道 历史又重演了(如何看待美国数十万加仑牛奶倒下水道)
- 历史惊人的相似,美国80万加仑牛奶倒入下水道,意味着什么(历史惊人的相似)
- 美国数十万加仑牛奶倒进下水道,世界会重演1929年的大萧条吗(美国数十万加仑牛奶倒进下水道)
热门推荐
- linux部署flask项目(用uWSGI和Nginx部署Flask项目的方法示例)
- css各种引用方法(CSS中的四种引用方式)
- 微信小程序日期选择器有星期天(微信小程序 滚动选择器时间日期详解及实例代码)
- sqlserver分组查询(sql server如何利用开窗函数over进行分组统计)
- nginx反向代理通俗讲解(nginx 反向代理之 proxy_pass的实现)
- php添加到数组的用法(详解PHP 7.4 中数组延展操作符语法知识点)
- html5app开发用什么平台(Html5与App的通讯方式详解)
- SQL Server中GROUPING SETS
- 真实的codeigniter错误(Codeigniter里的无刷新上传的实现代码)
- python中列表remove的用法汇总(对python_discover方法遍历所有执行的用例详解)