SQL SERVER 错误捕捉与事务


在SQL server (MSSQL)写代码中,不管是一段SQL代码,还是存储过程等,有的时候总会遇见程序报错,导致系统崩溃,

与C#同理,SQL SERVER 也提供了回滚与错误捕捉,事务比较复杂,有时间在以后的文章中与大家分享。

任何程序都可能出现错误,在SQL Server中执行Transact-SQL也不例外。如果在Transact-SQL中发生了错误,

一般有两种捕捉错误的方法,一种是在客户端代码(如 c#、delphi等)中使用类似try...catch的语句进行捕捉;

另外一种就是在Transact-SQL中利用Transact-SQL本身提供的错误捕捉机制进行捕捉。

本文就Transact-SQL语句的执行而产生的错误,给大家简单介绍。

不带事务,简单捕捉:

DECLARE @A TABLE  
 (ID INT) 

BEGIN TRY  

    INSERT INTO @A SELECT 1     
    INSERT INTO @A SELECT 'ceshi'  

END TRY  

BEGIN CATCH  

PRINT 'Error Number :'+CAST(ERROR_NUMBER() AS VARCHAR(10))
PRINT 'Error Message :'+ERROR_MESSAGE()
PRINT 'Error Severity :'+CAST(ERROR_SEVERITY() AS VARCHAR(10))
PRINT 'Error State :'+CAST(ERROR_STATE() AS VARCHAR(10))
PRINT 'Error Line :'+CAST(ERROR_LINE() AS VARCHAR(10))
PRINT 'Error Proc :'+COALESCE(ERROR_PROCEDURE(),'not within proc')

END CATCH  

BEGIN TRY  END TRY 关键字是错误捕捉的关键字,表示开始监测程序执行情况,中间放你的代码

BEGIN CATCH   END CATCH   中间可以捕捉程序运行发生的异常,但是注意,并不是所有错误都可以捕捉,当然,

可以配置进SQL SERVER 数据库。

BEGIN CATCH   END CATCH之间可以很多事,比如写入操作日志,或者进行其他操作,此方法不会回滚你所执行的代码,需要手动修改

带事务的,简单捕捉:

IF (OBJECT_ID('A','U') IS NOT NULL)  
DROP TABLE A  
CREATE TABLE A(ID INT) 
BEGIN TRAN
BEGIN TRY  

    INSERT INTO A SELECT 1     
    INSERT INTO A SELECT 'ceshi'  

    COMMIT TRAN --提交事务

END TRY  

BEGIN CATCH  

ROLLBACK TRAN--回滚事务

PRINT 'Error Number :'+CAST(ERROR_NUMBER() AS VARCHAR(10))
PRINT 'Error Message :'+ERROR_MESSAGE()
PRINT 'Error Severity :'+CAST(ERROR_SEVERITY() AS VARCHAR(10))
PRINT 'Error State :'+CAST(ERROR_STATE() AS VARCHAR(10))
PRINT 'Error Line :'+CAST(ERROR_LINE() AS VARCHAR(10))
PRINT 'Error Proc :'+COALESCE(ERROR_PROCEDURE(),'not within proc')

END CATCH  

如果执行上面的代码,将会输出以下内容:

 把 SELECT * FROM A 加上,会看见A表中并未出现插入的数据

SQL SERVER 消息库

今天的分享到此结束,有需要的可以关注留言讨论

能帮朋友解决问题的记得给个关注支持一下,以后将多多分享SQL SERVER 相关知识