SQL Server 2012 错误处理增强THROW

2014-11-24 18:33:16 · 作者: · 浏览: 1

在C#中开发人员可以使用TryCatch/Throw语句对错误进行处理,虽然在2005后,SQL Server也引入了Try/Catch语句,但是Throw没有被移植过来。开发者需要使用RAISERROR语句将错误消息返回到应用程序中,对于自定义的错误信息,需要先在sys.Messages创建错误才可以在RAISEERROR中使用。


在2012中,微软终于增加了THROW语句,THROW包含三个参数(可以不用带参数):THROW[ { error_number | @local_variable }, { message | @local_variable },{ state |@local_variable }] [ ; ]


注意:如果使用error_number参数,错误号码必须大于50000小于等于 2147483647


下面的例子将使用RAISEERROR和THROW处理被除数不能为0的错误:


BEGIN TRY


SELECT 1/0


END TRY


BEGIN CATCH


DECLARE @msg NVARCHAR(MAX)=ERROR_MESSAGE()


RAISERROR (@msg, 16, 1)


END CATCH


错误信息:
(0 row(s) affected)


Msg 50000, Level 16, State 1, Line 6


Divide by zero error encountered.



BEGIN TRY


SELECT 1/0


END TRY


BEGIN CATCH


THROW


END CATCH


(0 row(s) affected)


Msg 8134, Level 16, State 1, Line 2


Divide by zero error encountered.


THROW也可以不在TRY/CATCH块中使用:


sp_addmessage @msgnum= 51000,


@severity =1,


@msgtext =N'i am wrong';


GO


THROW 51000, 'i am wrong', 1;


结果:


Msg 51000, Level 16, State 1, Line 1


i am wrong


RAISERRORThrow的不同: