首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

[SQLServer]异常处理

2012-08-17 
[SQLServer]错误处理一.RAISERRORRAISERROR( {msg_id | msg_str}{,severity, state}[, arg[,...n ]] )[WIT

[SQLServer]错误处理
一.RAISERROR

RAISERROR( {msg_id | msg_str}{,severity, state}           [, arg[,...n ]] )           [WITH option [,...n ]]--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   --8134SELECT @@ERROR   --0,执行过之后就是0了RAISERROR ( 50001, 1, 1 )SELECT @@ERROR   --0,因为严重级别小于11RAISERROR ( 50001, 11, 1 )SELECT @@ERROR   --50001,因为严重级别大于等于11--建议使用TRY...CATCH


三.TRY...CATCH: 可以嵌套
DECLARE @Pv intBEGIN TRY    SELECT @Pv = 'abc'END TRYBEGIN 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)问题



热点排行