[SQLServer]错误处理

一.RAISERROR

RAISERROR( {msg_id | msg_str}{,severity, state}
[, arg[,...n ]] )
[WITH option [,...n ][flag] [width] [. precision] [{h | l}] ] type
--flag: 一个代码,用于确定输入值的对齐方式和间距
---(减号): 左对齐
--+(加号): 在值前显示+或-号
--0: 在输出前添加前缀0
--#: 依赖于格式化方式,在非零值前添加0,0x或0X
--(空白): 在前面添加空白前缀
--width: 输出的最小宽度
--precision: 从字符串值的参数值中得到的所使用的字符的最大字符数
--h: 字符类型
--d或i: 有符号整数,对于整数
--o: 无符号八进制数,对于无符号八进制数
--s: 字符串,对于字符串
--u: 无符号整数,对于无符号整数
--x或X: 无符号十六进制数,对于无符号十六进制数
--p: 对于指针

--severity: 错误严重级别,从无害的1到致命的25
--2-14常规
--15警告
--16以上表示错误
--20-25严重错误
--若为11以上,@@ERROR的值被设置为RAISERROR中的消息号
--state: 状态,一般设置为1



WITH选项:
LOG: 将错误消息放入到windows错误日志中(注意windows错误日志可能被填满)
NOWAIT: 直接将错误发送给客户
SETERROR: 只在消息字符串中将错误号复位到50000



--系统存储过程sp_addmessage可用于创建全局的错误消息
sp_addmessage [@msgnum = ] msg_id, --消息号,通常大于50000
[@severity = ] severity, --范围1-25
[@msgtext = ] 'msg' --输出的消息
[, [@lang = ] 'language'] --如果需要定义错误消息的语言
[, [@with_log = ] 'with_log'] --若使用windows错误消息,可设为true
[, [@replace = ] 'replace'] --替换一条现有的消息


sp_addmessage 50001,1,'message is ...%010u',@replace='replace'
raiserror(50001,11,1,243)
--输入为
--Msg 50001, Level 11, State 1, Line 1
--message is ...0000000243



二.@@ERROR: 全局变量

最基本的错误处理方式。

SELECT 100/0 --无
SELECT @@ERROR --8134
SELECT @@ERROR --0,执行过之后就是0了

RAISERROR ( 50001, 1, 1 )
SELECT @@ERROR --0,因为严重级别小于11

RAISERROR ( 50001, 11, 1 )
SELECT @@ERROR --50001,因为严重级别大于等于11

--建议使用TRY...CATCH


三.TRY...CATCH: 可以嵌套

DECLARE @Pv int
BEGIN TRY
SELECT @Pv = 'abc'
END TRY
BEGIN CATCH
DECLARE @msg varchar(100)
SELECT @msg = LTRIM(STR(ERROR_LINE()))+','+ LTRIM(STR(ERROR_NUMBER())) + ',' + ERROR_MESSAGE()
RAISERROR(@msg,11,1)
END CATCH
--Msg 50000, Level 11, State 1, Line 8
--3,245,Conversion failed when converting the varchar value 'abc' to data type int.

--ERROR_LINE(): 物理行号
--ERROR_NUMBER(): 同消息相关联的消息号
--ERROR_MESSAGE(): 消息文本
--ERROR_PROCEDURE(): 若在存储过程或触发器中使用,将包含其名称,一般使用输出NULL
--ERROR_SEVERITY(): 错误的严重级别数值
--ERROR_STATE(): 错误--msg_id: sqlserver错误消息表中存在的系统和用户定义的消息
--msg_str: 消息字符,可定义文字内的参数
--% [[flag] [width] [. precision] [{h | l}] ] type
--flag: 一个代码,用于确定输入值的对齐方式和间距
---(减号): 左对齐
--+(加号): 在值前显示+或-号
--0: 在输出前添加前缀0
--#: 依赖于格式化方式,在非零值前添加0,0x或0X
--(空白): 在前面添加空白前缀
--width: 输出的最小宽度
--precision: 从字符串值的参数值中得到的所使用的字符的最大字符数
--h: 字符类型
--d或i: 有符号整数,对于整数
--o: 无符号八进制数,对于无符号八进制数
--s: 字符串,对于字符串
--u: 无符号整数,对于无符号整数
--x或X: 无符号十六进制数,对于无符号十六进制数
--p: 对于指针

--severity: 错误严重级别,从无害的1到致命的25
--2-14常规
--15警告
--16以上表示错误
--20-25严重错误
--若为11以上,@@ERROR的值被设置为RAISERROR中的消息号
--state: 状态,一般设置为1



WITH选项:
LOG: 将错误消息放入到windows错误日志中(注意windows错误日志可能被填满)
NOWAIT: 直接将错误发送给客户
SETERROR: 只在消息字符串中将错误号复位到50000



--系统存储过程sp_addmessage可用于创建全局的错误消息
sp_addmessage [@msgnum = ] msg_id, --消息号,通常大于50000
[@severity = ] severity, --范围1-25
[@msgtext = ] 'msg' --输出的消息
[, [@lang = ] 'language'] --如果需要定义错误消息的语言
[, [@with_log = ] 'with_log'] --若使用windows错误消息,可设为true
[, [@replace = ] 'replace'] --替换一条现有的消息


sp_addmessage 50001,1,'message is ...%010u',@replace='replace'
raiserror(50001,11,1,243)
--输入为
--Msg 50001, Level 11, State 1, Line 1
--message is ...0000000243



二.@@ERROR: 全局变量

最基本的错误处理方式。

SELECT 100/0 --无
SELECT @@ERROR --8134
SELECT @@ERROR --0,执行过之后就是0了

RAISERROR ( 50001, 1, 1 )
SELECT @@ERROR --0,因为严重级别小于11

RAISERROR ( 50001, 11, 1 )
SELECT @@ERROR --50001,因为严重级别大于等于11

--建议使用TRY...CATCH


三.TRY...CATCH: 可以嵌套

DECLARE @Pv int
BEGIN TRY
SELECT @Pv = 'abc'
END TRY
BEGIN CATCH
DECLARE @msg varchar(100)
SELECT @msg = LTRIM(STR(ERROR_LINE()))+','+ LTRIM(STR(ERROR_NUMBER())) + ',' + ERROR_MESSAGE()
RAISERROR(@msg,11,1)
END CATCH
--Msg 50000, Level 11, State 1, Line 8
--3,245,Conversion failed when converting the varchar value 'abc' to data type int.

--ERROR_LINE(): 物理行号
--ERROR_NUMBER(): 同消息相关联的消息号
--ERROR_MESSAGE(): 消息文本
--ERROR_PROCEDURE(): 若在存储过程或触发器中使用,将包含其名称,一般使用输出NULL
--ERROR_SEVERITY(): 错误的严重级别数值
--ERROR_STATE(): 错误数字状态值
--注意在try...catch中使用临时表时产生延迟名称解析(deferred name resolution)问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值