SQL SERVER 错误捕捉与事务
阅读原文时间:2023年08月26日阅读:4

在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 相关知识