sql-server - SqlServer GOTO 用于带有选择的退出过程

标签 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

最佳答案

如果您的实际代码比单个 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

关于sql-server - SqlServer GOTO 用于带有选择的退出过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43975901/

相关文章:

sql - 如何计算 SQL Server 中的第 90 个百分位数

sql-server - GUID 全零的 MS SQL 表

sql - 如何创建一个使用多个列中不同值的聚合作为参数的表?

asp.net - 无法在asp.net中执行没有参数的mysql存储过程

sql-server - 编写 sql 存储过程的最佳实践是什么

sql - 如何获取存储过程的时间(以毫秒为单位)

asp.net - 如何使用存储过程从 ASPNETDB 获取用户信息

SQL 服务器 : Use a column to save order of the record

excel - 从 Excel 调用具有多个参数的存储过程

oracle - 我可以用来防止行被插入到 Oracle 表中的侵入性最小的锁定机制是什么?