(5)DML增强功能-try catch及事务控制

一、事务控制与Try Catch结合

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
  RAISERROR (‘Error raised in TRY block.‘, -- Message text.
  16, -- Severity.
  1 -- State.
);
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;

原文地址:https://www.cnblogs.com/gered/p/9112846.html

时间: 2024-10-17 16:42:56

(5)DML增强功能-try catch及事务控制的相关文章

DML增强功能-CTE(1)

1.CTE的通用形式 WITH temp_name as ( CTE查询结果集 ) with/as :关键字 temp_name:为CTE临时使用名称,可以看初学者做是一个临时表 ():查询结果集主体 2.CTE的递归查询 其实CTE最强大的地方就是在于其递归查询 举例1:使用CTE递归获取某年的1-12月份 --获取2018年的1-12月份(可以用来做外连接和分组) ;with date_test as ( select cast('20180101 00:00:00' as datetime

(2)DML增强功能-4大排名函数与top ties

1.row_number()  over( partition by column order by column) (1)测试数据 (2)根据程序使用row_number() over()排序 (3)说明:即使相同分数,也会按排序(这里用到的是默认聚集索引(id字段)排序) (4)至于row_number()  over(partition by column order by column) 加上分区的这种,这里就不演示了,(1-3)中演示的是以所有数据为整体排序,如果用上partition

12c分区增强功能,新功能(文档ID 1568010.1)

12c Partitioning Enhancements, New Features (Doc ID 1568010.1) APPLIES TO: Oracle Database - Enterprise Edition - Version 12.1.0.1 and laterOracle Database Cloud Schema Service - Version N/A and laterOracle Database Exadata Express Cloud Service - Ve

virtualbox虚拟机kali增强功能安装

添加更新源 leafpad /etc/apt/sources.list 阿里塬 deb http://mirrors.aliyun.com/kali sana main non-free contrib deb http://mirrors.aliyun.com/kali-security/ sana/updates main contrib non-free deb-src http://mirrors.aliyun.com/kali-security/ sana/updates main c

虚拟机下安装centos提醒增强功能

在VirtualBox虚拟机中安装了Centos系统,安装增强功能时报错,错误为"centos the headers for the current running kernel were not found......",报错原因是系统找不到kernel headers,在网上找到了方法,原解决方案为: 1)yum install gcc  -y 2)yum install gcc kernel-devel kernel-headers -y 3)重启系统 但在执行上述步骤并重启系

virtualbox安装增强功能(centos6.5)

vitualbox安装增强功能(centos 6.5) 1. 安装依赖包 #yum install kernel-headers-$(uname -r) #yum install kernel-devel-$(uname -r) #yum install gcc* 如果上述内核开发包安装失败,则根据自己系统内核版本下载的相应的rpm包: 下载链接: http://rpmfind.net/ http://rpm.pbone.net/ (例如, centos6.5) rpm -ivh kernel-

【转】virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法

原文网址:http://fuliang.iteye.com/blog/1102998 在笔记本安装Ubuntu11.04增强功能失败 引用 [email protected]:~$ sudo /etc/init.d/vboxadd setup Removing existing VirtualBox DKMS kernel modules ...done. Removing existing VirtualBox non-DKMS kernel modules ...done. Building

Linux # Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso

问题: Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso 分析:通过分析日志,%vbox_path%\VirtualBox Guest Additions\install_drivers.log发现, 查看安装过程中的信息,如下图,发现缺少 相关dll文件, Linux # Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso,布布扣,bubuko.com Linux # Virtul Box 安

virtualbox linux客户机中安装增强功能包缺少kernel头文件问题解决

linux客户机中安装增强功能包总会提示缺少kernel头文件 根据发行版的不同,用命令行软件包管理命令安装dkms build-essential linux-headers-$(uname -r),我的客户机是openSUSE,所以命令如下: zypper install dkms build-essential linux-headers-$(uname -r) 然后,再用root身份安装光盘中的vboxaddition.run,安装完成后,重启客户机即可.