【问题标题】:Problem due to using RETURN in Stored Procedure由于在存储过程中使用 RETURN 导致的问题
【发布时间】:2011-06-29 04:22:48
【问题描述】:

我写了一个存储过程。在其中我想检查一个条件,如果该条件变为真,那么我不想继续处理存储过程的其余部分。

如果返回 false,那么我想继续存储过程的剩余部分。

我的存储过程在这里:

    IF (@RefPOID <> 0)
    BEGIN
    IF EXISTS(// SELECT STATEMENT)
    BEGIN
    SET @Status = 'Please select the Items'                 
        RETURN
    END 
END 
    IF(POID = 0)
    BEGIN

           //INSERTION

    END
    ELSE
    BEGIN

           //DELETION

    END

此存储过程已成功编译。但是在前端调用这个存储过程的时候,却报错了

System.Data.SqlClient.SqlException:一个 当前发生严重错误 命令。结果,如果有的话,应该 被丢弃。

如果我从存储过程中删除了 RETURN 语句,那么它工作正常。

如果条件变为假,当我从前端调用时,存储过程工作正常。

但我想检查那里的条件,如果是真的就返回。

我确信由于 RETURN 的存在会出现问题。

为什么会出现问题?出了什么问题?如何解决这个问题?请有任何建议。

【问题讨论】:

  • 您在事务中间使用RETURN - 您可能需要在RETURN 之前添加ROLLBACK TRANSACTION 以正确终止正在运行的事务...
  • 非常正确。查看 msdn.microsoft.com/en-us/library/ms179296(v=SQL.90).aspx> 了解在 T-SQL 中使用 TRY CATCH 的详细信息。此链接中有一个名为“TRY...CATCH with RAISERROR”的部分,msdn.microsoft.com/en-us/library/ms175976.aspx> 有一个标题为“B. Using TRY...CATCH in a transaction”的部分提供了有用的示例。
  • @marc:是的,马克。你说的绝对是真的。谢谢。
  • @Moose:非常感谢驼鹿。你说的对。感谢您的贡献。
  • @gbn:是的。我只是提到了 sp 的功能。

标签: sql sql-server-2005 sql-server-2008 stored-procedures return


【解决方案1】:

如果您打算让状态指示失败,那么我很想在调用此存储过程之前执行验证检查,或者在 TRY CATCH 块中使用 RAISERROR。

BEGIN TRY

IF (@RefPOID <> 0)
BEGIN
      IF EXISTS(SELECT 1 FROM @Item I WHERE NOT EXISTS(SELECT P.ItemID FROM PUR_POIndent P WHERE P.ItemID = I.ItemID AND P.D1 = I.D1 AND P.D2 = I.D2 AND P.D3 = I.D3 AND P.POID = @RefPOID))
          BEGIN
          RAISERROR('Please select Items only related to the Reference Purchase', 16, 1)
          RETURN
      END  
END

...
END TRY
BEGIN CATCH

DECLARE @ErrorMessage NVARCHAR(MAX);
        DECLARE @ErrorSeverity INT;
        DECLARE @ErrorState INT;

            SELECT @ErrorMessage = ERROR_MESSAGE(),
                   @ErrorSeverity = ERROR_SEVERITY(),
                   @ErrorState = ERROR_STATE();

            RAISERROR (@ErrorMessage, -- Message text.
                       @ErrorSeverity, -- Severity.
                       @ErrorState -- State.
                        );
END CATCH

【讨论】:

  • @Moose:我在我的问题中提到了从前端调用时得到的错误。
  • @thevan:看看 msdn.microsoft.com/en-us/library/ms178592(v=SQL.90).aspx> 的“备注”部分,你会看到 raiserror 是如何工作的。它指出,“RAISERROR 生成的错误与数据库引擎代码生成的错误相同”,因此您最终会遇到 SQLException。您可以使用 RAISERROR 分配用户定义的错误编号,如有必要,您可以在 SQLException 中检查该错误编号。我认为这是 SQLException 类的“数字”属性。见 msdn.microsoft.com/en-us/library/…>
【解决方案2】:

我认为您的退货不是问题所在。查询可能无效。 但是您说如果您删除退货,它会起作用。这很奇怪。

能否请您发布完整的代码?

您是否尝试过在查询分析器或工作室管理器中运行?

你有:

SELECT 1 FROM @Item

这有效吗? @Item 是什么 - 一个表变量?

【讨论】:

  • 是的,它是一个表变量。该查询工作正常。如果我删除 RETURN 则存储过程正在工作。
  • 您是否希望应用中有任何数字返回值?
  • @Projapati:我编辑了我的问题。在那我发布了我的完整存储过程。它可能看起来很长。但我需要你的宝贵建议。
  • 您在第一次返回之前是否初始化了所有变量?如果不是,请在程序开始时将所有输出变量设置为一些虚拟值。希望能解决这个问题。
  • @Projapati:我得到了答案。在使用 RETURN 之前我没有回滚。感谢您的贡献。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2018-03-14
  • 2019-09-19
  • 2013-05-24
  • 2013-12-05
  • 1970-01-01
相关资源
最近更新 更多