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
严重度代码 | 描述 |
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 | 字符串 |
u | 无符号的整数 |
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