(1.5)DML增强功能-try catch及事务控制
2023-09-11 14:21:10 时间
直接看这篇吧 https://www.cnblogs.com/gered/p/8746008.html
一、事务控制与Try Catch结合
当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。 当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。 如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。 OFF 是默认设置。
BEGIN TRY BEGIN TRAN; DECLARE @aaa NVARCHAR(MAX); SET @aaa = 9 / 0; COMMIT TRAN; END TRY BEGIN CATCH --【错误】-- DECLARE @ErrorMessage NVARCHAR(MAX) , @ErrorSeverity INT , @ErrorState INT , @exception NVARCHAR(255); SELECT @ErrorMessage = ERROR_MESSAGE() , @ErrorSeverity = ERROR_SEVERITY() , @ErrorState = ERROR_STATE(); PRINT '【!ERROR!】'; SET @exception = '(State ' + CAST(@ErrorState AS NVARCHAR(20)) + ', Severity ' + CAST(@ErrorSeverity AS NVARCHAR(20)) + ') ' + @ErrorMessage; PRINT @exception; ROLLBACK; PRINT '回滚成功' END CATCH;
try catch注意事项:
try catch 常用错误函数处理;
二、错误处理函数:
其他:
(1)@@ERROR :当前一个语句遇到错误,则返回错误号,否则返回0。需要注意的是@ERROR在每一条语句执行后会被立刻重置,因此应该在要验证的语句执行后检查数值或者是将它保存到局部变量中以备将来使用。
(2)@@ROWCOUNT:返回当前一个语句影响的行数,需要注意的是它在每一条语句执行后会被立刻重置(包含其本身),因此应该在要验证的语句执行后检查数值或者是将它保存到局部变量中以备将来使用。
(3)@@TRANCOUNT:当前事务数量
三、自定义错误(抛出异常)
本部分转自:https://www.cnblogs.com/weixing/p/3930162.html
BEGIN TRY declare @n int,@sql varchar(100) set @n = 100 set @sql = 'select 1' RAISERROR ('Error raised in TRY block.Test the number is %d,the sql string is %s', -- Message text. 16, -- Severity. 1, -- State. @n, -- 参数1,与message中的 @sql --参数2 ); END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); print @errorMessage RAISERROR (@ErrorMessage, -- Message text. @ErrorSeverity, -- Severity. @ErrorState -- State. ); END CATCH;
演示如图:
详细说明如下:
raiserror 的作用: raiserror 是用于抛出一个错误。[ 以下资料来源于sql server 2005的帮助 ]
其语法如下:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ]
)
[ WITH option [ ,...n ] ]
简要说明一下:
第一个参数:{ msg_id | msg_str | @local_variable }
msg_id:表示可以是一个sys.messages表中定义的消息代号;
使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。
用户定义错误消息的错误号应当大于 50000。
msg_str:表示也可以是一个用户定义消息,该错误消息最长可以有 2047 个字符;
(如果是常量,请使用N'xxxx',因为是nvarchar的)
当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息。
@local_variable:表示也可以是按照 msg_str 方式的格式化字符串变量。
第二个参数:severity
用户定义的与该消息关联的严重级别。(这个很重要)
任何用户都可以指定 0 到 18 之间的严重级别。
[0,10]的闭区间内,不会跳到catch;
如果是[11,19],则跳到catch;
如果[20,无穷),则直接终止数据库连接;
第三个参数:state
如果在多个位置引发相同的用户定义错误,
则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。
介于 1 至 127 之间的任意整数。(state 默认值为1)
当state 值为 0 或大于 127 时会生成错误!
第四个参数:argument
用于代替 msg_str 或对应于 msg_id 的消息中的定义的变量的参数。
第五个参数:option
错误的自定义选项,可以是下表中的任一值:
LOG :在错误日志和应用程序日志中记录错误;
NOWAIT:将消息立即发送给客户端;
SETERROR:将 @@ERROR 值和 ERROR_NUMBER 值设置为 msg_id 或 50000;
相关文章
- PHP控制输出不缓存头
- 2-4python语法基础-基础-控制语句
- springboot+mybatis整合shiro——登录认证和权限控制
- 远程桌面控制:SmartCode VNC ViewerX ActiveX 3.10 Crack
- spring中事务传播下,特殊方法手动控制事务
- android 10.0实现通过系统属性控制挂载otg设备功能
- 基于强化学习的电动汽车的储能系统优化控制和存储容量优化(Matlab代码实现)
- 【无人机群】用于控制具有污染物云跟踪的模拟无人机群研究(Matlab代码实现)
- 【单片机项目与仿真】直流电机控制的Proteus仿真及C语言程序设计
- Asp.Netserver控制发展Grid实现(一个)UI转让
- 美丽的表格样式(使用CSS样式表控制表格样式)
- Linux nmcli控制NetworkManager的命令行工具
- 汇编语言入门五:流程控制(一)
- Java基础(13)-流程控制之循环结构
- Oracle 中绑定变量 并发控制 锁 闪回
- Spring入门后半部分----JDBCTemplate和事务控制
- Pandas数据处理1、DataFrame删除NaN空值(dropna各种属性值控制超全)
- SystemVerilog: 打印显示之数据格式控制及特殊字符详解
- 苹果手机如何远程控制华为安卓平板电脑
- 【Xilinx AX7103 MicroBalze学习笔记3】MicroBlaze 利用 AXI GPIO 控制 LED 灯