用于退出程序的SqlServer GOTO with select

时间:2017-05-15 09:30:32

标签: sql-server stored-procedures

我知道有很多决定。 然而。如果我有程序,那么在很多情况下,我想选择一个结果并退出程序。 使用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

2 个答案:

答案 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