2010-01-06 89 views
0

你好我有一个扩展存储过程发送一条错误消息。来自扩展存储过程的SQL Server捕获错误

srv_sendmsg(pSrvProc, SRV_MSG_ERROR, errorNum, SRV_FATAL_SERVER, 1, 
      NULL, 0, (DBUSMALLINT) __LINE__, 
      buff, 
      SRV_NULLTERM); 

我设置的严重性SVR_FATAL_SERVER只是作为一个测试,看看我是否会导致消息抛出一个异常的SQL。

在我的SQL我做:

BEGIN TRY 
    EXEC dbo.xp_somethingCool 
    SET @Error = @@ERROR 
END TRY 
BEGIN CATCH 
    PRINT 'AN Error occoured!' 
    SELECT ERROR_NUMBER() AS ErrorNumber 
      ,ERROR_MESSAGE() AS ErrorMessage; 
END CATCH 

我想,当我的XP发送错误信息的TSQL将捕获错误并选择ERROR_NUMBER和ERROR_MESSAGE。相反,最终发生的事情是,xp发送消息,并且T-SQL继续按照它的方式继续发生。 @@ Error变量也不会被设置。

所以我想知道是否有任何技巧让SQL从XP中捕获错误?

谢谢,劳尔

+0

Microsoft建议您不要再使用'srv_sendmsg'。请参阅http://msdn.microsoft.com/en-us/library/ms164673.aspx上的警告 – Aaronaught 2010-01-07 00:01:40

回答

0

您只能测试扩展存储过程的结果,并使用它来抛出异常。

... 
EXEC @rtn = dbo.xp_somethingCool 
IF @rtn <> 0 
    RAISERROR ... 
... 

非常简单来说,扩展存储过程不是SQL数据库引擎上运行,所以你不能发出RAISERROR。请参阅KB 190987获取更多信息

0

你应该能够使用RAISERROR抛出异常。

每个评论:你不是在创建你自己的扩展存储过程吗?如果是这样,你可以使用throw或者像1/0那样抛出一个异常。

+0

问题是如何在扩展存储过程中RAISERROR? – HaxElit 2010-01-07 00:09:39

0

永远不要提高如此之高。任何在严重程度超过16的情况下都会中止批处理,因此您的T-SQL catch块永远不会有机会运行。与SVR_FATAL_SERVER一样高的值将会立即关闭服务器。

+0

我并不反对,但是当它从XP升级时,它似乎被忽略了,这是我做到这一点的原因。我想看看它是否真的做了什么。我不知道是否有另一个API调用,我可以用它来使sql服务器实际处理消息,或者如果我错过了一面旗帜? – HaxElit 2010-01-07 00:11:59

+0

我不记得确切,但它可能是严重性为自己的保护上限。尝试使用16进行测试。 – 2010-01-07 00:39:39