mysql中try_cast函数_SQL Server 数据库try catch 存储过程

本文探讨了SQL Server存储过程中TRY...CATCH的使用,特别是关于嵌套事务和异常处理的注意事项。通过实例展示了如何使用THROW、sp_addmessage自定义错误以及在事务中处理错误的方法,强调了在事务中避免使用RETURN和正确使用ROLLBACK的重要性。
摘要由CSDN通过智能技术生成

概述

最近因为业务的需求写了一段时间存储过程,发现之前写的存储过程存在一些不严谨的地方,特别是TRY...CATCH中嵌套事务的写法;虽然之前写的并没有错,但是还是埋藏着很大的隐患在里面。希望这篇文章能给大家一些参考;文章内容有点长还望耐心阅读。

1.插入测试数据

48304ba5e6f9fe08f3fa1abda7d326ab.png

----创建表

DROP TABLEscore

GO

CREATE TABLE [dbo].[score](

id INT NOT NULL PRIMARY KEY IDENTITY(1,1),

name VARCHAR(50) NOT NULL,

score INT NOT NULL CHECK (score>=0),

months INT NOT NULL,

createtime DATETIME NOT NULL DEFAULT GETDATE()

)

---根据姓名月份查询分数

CREATE INDEX IX_score_name ONscore(name,months) include(score)

---根据月份查询最高分数

CREATE INDEX IX_score_months ONscore(months) include(name,score)

---创建姓名和月份组合的唯一索引

CREATE UNIQUE INDEX IX_score_months_name ONscore(months,name)

------插入测试数据

TRUNCATE TABLEscore

INSERT INTOscore(name,score,months)

VALUES('li',50,10),('chen',70,10),('zhang',80,10),('wang',90,10),('li',50,11),('chen',70,11),('zhang',80,11),('wang',90,11)

SELECT * FROM score;

48304ba5e6f9fe08f3fa1abda7d326ab.png

1237c5fea8dfde05ba9b430dd16ba463.png

2、THROW

THROW是在2012版本中引入的,在有些场景当中,应用程序端不做一些合法性的验证,这些验证会被放在数据库端来验证。当数据库端验证输入的信息不合法时需要主动抛出异常来中断代码的执行。

THROW既可以接收错误信息抛错提示,同时也可以手动抛出错误到CATCH中。语法如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

;THROW

THROW [{ error_number | @local_variable },

{ message | @local_variable },

{ state | @local_variable } ]

[; ]参数

error_number

表示异常的常量或变量。 error_number是int并且必须为大于或等于 50000 且小于或等于 2147483647,如果CATCH中使用RAISERROR来接收错误信息那么指定的error_number必须在sys.messages 中存在;如果使用CATCH来接收则不需要。

消息

描述异常的字符串或变量。 消息是nvarchar(2048)。

状态

在 0 到 255 之间的常量或变量,指示与消息关联的状态。 状态是tinyint。

48304ba5e6f9fe08f3fa1abda7d326ab.png

注意:

1.THROW代码前必须要用分号,因为THROW会中断代码的执行,所以如果将THROW放在CATCH中时必须放在ROLLBACK TRAN之后,否则不会回滚事务导致对象一直处于提交状态被锁。

2.THROW放CATCH中可以达到RAISERROR一样的效果,同时还简便了代码。

3. THROW能返回正确的错误代码行号,而RAISERROR没办法

3.sp_addmessage

自定义错误号

48304ba5e6f9fe08f3fa1abda7d326ab.png

EXECsp_addmessage

@msgnum = 60000,

@severity = 16,

@msgtext = N'Manual cast wrong ',

@lang = '

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值