【发布时间】:2013-03-28 00:51:19
【问题描述】:
我在 SQL Server 2012 中有存储过程说 spXample 和一个缩放器值函数说 fXample。
我从 spXample 调用函数 fXample。
我可以在函数中抛出异常并在存储过程的 Catch 块中捕获它并重新抛出到调用 C# 代码吗?
更新:
我写的函数是这样的:
CREATE FUNCTION dbo.fXample(@i INT)
RETURNS TINYINT
AS
BEGIN
RETURN (SELECT CASE WHEN @i < 10
THEN THROW 51000,'Xample Exception',1;
ELSE (SELECT @i)
END);
END
GO
我遇到错误
消息 443,级别 16,状态 14,过程 fXample,第 46 行无效使用 函数中的副作用运算符“THROW”。
如何编写替代代码来实现上述功能?
【问题讨论】:
-
根据什么类型的条件在函数中抛出异常?以及什么类型的函数,标量、TVF、多语句TVF?
-
尝试 RAISERROR:msdn.microsoft.com/en-us/library/ms178592.aspx。如果你给它一个较低的严重性,它可以被 CATCH 捕获。从那里,您可以使用“严重”严重性(我认为 11+;页面上有示例)调用它,它将停止 SP 的执行并将其踢回您的应用程序。
-
Aaron 它的定标器值,异常将基于验证。
-
这里没有 2012 年可供测试,但我认为你不能。如果你尝试会发生什么?在以前的版本中,尝试使用
RAISERROR会失败并显示Invalid use of a side-effecting operator 'RAISERROR' within a function. -
@AaronBertrand 请参阅stackoverflow.com/questions/1485034/… 如何处理此问题(+1 指出如何发布此类信息)
标签: sql sql-server exception-handling