SQL Server - THROW字句对比RAISERROR子句
SQL Server 2012开始引入了THROW字句用于替代从SQL Server开始沿用至今的RAISERROR。既然作用相同,都是在TRY... CATCH代码块后不抓错误然后抛出错误,它们之间的差异是什么?
RAISERROR statement | THROW statement |
If a msg_id is passed to RAISERROR, the ID must be defined in sys.messages. | The error_number parameter does not have to be defined in sys.messages. |
The msg_str parameter can contain printf formatting styles. | The message parameter does not accept printf style formatting. |
The severity parameter specifies the severity of the exception. | There is no severity parameter. The exception severity is always set to 16. |
上表列出了它们的差异
THROW对比RAISERROR最大的优势在于,我们不再需要在CATCH代码块里面捕捉到ERROR_MESSAGE(), ERROR_STATE()等几个系统函数的值然后赋值给变量,只需要一个THROW语句就可以完成原本RAISERROR需要赋值变量再通过参数传入抛出异常的过程。而且对于错误行的捕捉也是直接指向错误行,而不是像RAISERROR那样是RAISERROR语句发生时的代码行。而且THROW还是可以像RAISERROR一样可以传参,效果和RAISERROR是一样的。
总结就是RAISERROR可以做的THROW都可以做到,而THROW还可以节省RAISERROR原本需要多个步骤完成的事情。而微软也是推荐用THROW去代替RAISERROR。
-- Using THROW - 1 BEGIN TRYSELECT 1/0 as DivideByZero END TRY BEGIN CATCHTHROW; END CATCH GO
结果
(0 row(s) affected) Msg 8134, Level 16, State 1, Line 6 Divide by zero error encountered.
而如果用RAISERROR
USE [JerryDB] GO-- Using RAISERROR() DECLARE @ERR_MSG AS NVARCHAR(4000),@ERR_SEV AS SMALLINT,@ERR_STA AS SMALLINTBEGIN TRYSELECT 1/0 as DivideByZero END TRY BEGIN CATCHSELECT @ERR_MSG = ERROR_MESSAGE(),@ERR_SEV =ERROR_SEVERITY(),@ERR_STA = ERROR_STATE()SET @ERR_MSG= 'Error occurred while retrieving the data from database: ' + @ERR_MSGRAISERROR (@ERR_MSG, @ERR_SEV, @ERR_STA) WITH NOWAIT END CATCH GO
结果
(0 row(s) affected) Msg 50000, Level 16, State 1, Line 19 Error occurred while retrieving the data from database: Divide by zero error encountered.
参考:
New THROW statement in SQL Server 2012 (vs RAISERROR)
转载于:https://www.cnblogs.com/jenrrychen/p/5164889.html
SQL Server - THROW字句对比RAISERROR子句相关推荐
- SQL Server 存储过程中使用raiserror抛出异常
转自(SQL Server 存储过程中使用raiserror抛出异常 ) 一 系统预定义错误代码 SQL Server 有3831个预定义错误代码,由master.dbo.sysmessages 表维 ...
- SQL Server 20082005维护计划对比
SQL Server 2008维护计划中组件没有增加,同样还是十一个,只是在向导中将"清除维护"任务添加了进来,如下图所示 而在向导的第一步中,SQL Server 2005是选择 ...
- SQL Server与Oracle对比学习:权限管理(一)
http://blog.csdn.net/weiwenhp/article/details/8093661 我们发现我们现在的生活中到处是涉及到密码,你要记各种各样的密码.比如银行卡,邮件,QQ,微博 ...
- SQL Server学习笔记3——WHERE子句
1.WHERE语句格式 SELECT <字段列表> FROM <表名> WHERE <条件表达式> 2.WHERE语句条件表达式中可以用到的比较运算符
- Oracle 9i与MS SQL Server 2000之比较连载五.zz
http://kb.cnblogs.com/a/1153156 Oracle 9i与MS SQL Server 2000之比较连载五 2008-04-14 18:13 四.Oracle中新的数据库对象 ...
- SQL Server 中WITH (NOLOCK)浅析
概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如 ...
- SQL Server 中WITH (NOLOCK)浅析 2014-08-30 11:58 by 潇湘隐者, 58264 阅读, 33 评论, 收藏, 编辑 概念介绍 开发人员喜欢在SQL脚本
SQL Server 中WITH (NOLOCK)浅析 概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同 ...
- mysql union all sum_[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失
[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失 0 2020-08-03 18:00:30 SQL Server 数据类型 使用场景: 在进行多维度汇总数据时,需要将 ...
- 微软 SQL Server 2016 迁移技术培训实验营
SQL 微软数据平台的专家们,您们还在为不了解 Oracle 产品技术而苦恼吗?您还在为无法提供 Oracle 客户迁移服务而困惑吗?快来参加此次微软 SQL Server 2016 迁移技术动 ...
最新文章
- 我在学python-你们以为我在学C++?其实我在学Python!人生苦短!
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
- 理解javascript中的回调函数(callback)【转】
- ceil与intval区别
- windows 环境怎样恢复 (oracle 11g grid) ocr voting 损坏的集群
- (转)如何压缩SQL Server 2005指定数据库文件和日志的大小?
- leetcode刷题:除自身以外数组的乘积
- springboot连接redis错误 io.lettuce.core.RedisCommandTimeoutException:
- Castle Team宣布Castle将与ASP.NET MVC整合
- line: 1: Syntax error: word unexpected (expecting ))
- c语言ic卡读写软件,IC卡读写工具|ACR122U写卡软件下载 v3.7 免费版_最火软件站
- python无限锁屏_定时锁屏程序,Python祝你原理猝死!
- 智慧金融管理系统提供个性化的智能客户服务
- c语言科学计数法 10的负8次方,3*10的负8次方等于多少?为什么计算
- 微信小程序flex布局讲解
- 北京邮电大学计算机学院考研夏令营,北京邮电大学计算机学院(专业学位)计算机技术保研夏令营...
- iOS视频转码 mov 转 mp4
- 開關(switch)規格中,SPDT, DPDT, 3PDT, 4PDT是什麼意思?
- python花猫_涨见识了,在终端执行 Python 代码的 6 种方式!
- 2020年河南高考--各高校在河南录取分数线预测(本科二批——文科)