SQL server 错误处理

SQL server 对于一般错误都处理的很好,但是对于对于一些致命错误,会终止代码执行,下面语句用来捕捉记录错误

BEGIN TRY
	
END TRY
BEGIN CATCH
	/* 
		SELECT
			ERROR_NUMBER() AS ErrorNumber,
			ERROR_SEVERITY() AS ErrorSeverity,
			ERROR_STATE() AS ErrorState,
			ERROR_PROCEDURE() AS ErrorProcedure,
			ERROR_LINE() AS ErrorLine,
			ERROR_MESSAGE() AS ErrorMessage
	*/
END CATCH

@@error:全局变量包含了代码中最近一条T-SQL命令的错误状态,0表示命令执行成功。
1,为了检查错误发生的状态,可以将错误发生时@@error赋值给一个局部变量,用来对错误进行适当的检查的处理。
2,可以结合标签,事务处理,减少代码的冗余。例

Begin Tran
insert ,update ,delete执行SQl语句 
if @@ERROR <> 0 GOTO ERROR  
  
Commit Tran  
return  
  
ERROR:  
Rollback tran  
return 

另一种检查SQl语句执行成功的情况是使用@@Rowcount,判断上一条语句有没有执行成功,@@RowCount为零,表示没有语句执行成功。
常见的T-SQl致命错误有
1,数据类型不兼容
2,不可用的SQl Server资源
3,语法错误
4,与某些任务不兼容的SQL Server 高级设置
5,漏写了对象名或者对象名拼写错误

需要查看大多数致命错误可以执行一下语句
  select error,severity,description
  from master.dbo.sysmessages
  where severity>=19
  order by severity,error

简单的raiserror,从Sybase数据继承下来的,只能发送静态的错误编号和消息。返回的严重度总是16.

例,raiserror 55555' unable to update customer'

完整的raiserror

T-SQL错误处理可用的严重度代码
严重度代码  描述
10状态消息:没有产生任何错误,但是返回了一个消息
11-13 无特别的含义
14 信息消息
15警告消息
16严重错误:程序失败

为消息添加可变参数,例

Raiserror('unable to update%s', 16, -1, 'customer')
customer 可以是变量也可以是常量
多个参数可以用,隔开
RaisError('第一名是%s,第二名是%s 个,第三名是%s 个', 16, -1, @firstname, @secondname, @thirdname)

数据类型规范
类型规范    表示
d 或 i    带符号的整数
o    无符号的八进制数
s   字符串
无符号的整数
x 或 X   无符号的十六进制数
RAISERROR(N'<<%*.*s>>', -- Message text.
           10, -- Severity,
           1, -- State,
           7, -- First argument used for width.
           3, -- Second argument used for precision.
           N'abcde'); -- Third argument supplies the string.
-- The message text returned is: <<    abc>>.
GO
RAISERROR (N'<<%7.3s>>', -- Message text.
           10, -- Severity,
           1, -- State,
           N'abcde'); -- First argument supplies the string.
-- The message text returned is: <<    abc>>.
GO

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值