我知道有很多决定。
然而。如果我有程序,那么在很多情况下,我想选择一个结果并退出程序。
使用GOTO
语句很好,或者有更好的方式(不是经典if...else
)
示例:
create procedure MyProc @Parm int
as
declare @Result nvarchar(50)
set @Result = 'OK'
if @Parm = 1 begin
set @Result = 'Error Example 1'
goto ExitProc;
end
if @Parm = 2 begin
set @Result = 'Error Example 2'
goto ExitProc;
end
if @Parm = 3 begin
set @Result = 'Error Example 3'
goto ExitProc;
end
ect...
ExitProc:
select @Result as Result, 100 as P2
from Table1
答案 0 :(得分:3)
将您的真实代码复制得比单个if else if结构更复杂(如评论中所述),然后您可以在需要时提出自己的异常,强制存储过程退出并通知您的应用程序错误。
示例:
create procedure MyProc @Parm int
as
if @Parm = 1 begin
THROW 60001, 'Error Example 1', 1;
end
if @Parm = 2 begin
THROW 60001, 'Error Example 2', 2;
end
if @Parm = 3 begin
THROW 60001, 'Error Example 3', 3;
end
...
现在,您的应用程序可以捕获SQL Server抛出的这些异常,就好像它们是任何其他SQL错误一样。
你甚至可以在存储过程本身上捕获并处理这些错误,尽管我认为在应用程序中捕获它们会更优雅。
捕获存储过程错误的示例:
create procedure MyProc @Parm int
as
begin try
if @Parm = 1 begin
THROW 60001, 'Error Example 1', 1;
end
if @Parm = 2 begin
THROW 60001, 'Error Example 2', 2;
end
if @Parm = 3 begin
THROW 60001, 'Error Example 3', 3;
end
...
end try
begin catch
select error_message() as Result, 100 as P2
from Table1
end catch
答案 1 :(得分:0)
您可以使用CASE
代替GOTO
。
CREATE PROCEDURE MyProc @Parm int AS
DECLARE @Result nvarchar(50)
SELECT 100 as P2, @Result = CASE @Parm
WHEN 1 THEN 'Error Example 1'
WHEN 2 THEN 'Error Example 2'
WHEN 2 THEN 'Error Example 3'
ELSE 'OK'
END