一次处理多个存储过程状态

Handle multiple stored procedure status at once

我不确定是否有办法处理多个 return 状态

IF @Age NOT BETWEEN 22 and 65
    RETURN -101 -- Age Criteria not met
ELSE IF (SELECT mem_status FROM Member WHERE mem_nric=@MemberNRIC) <>'Active'
    RETURN -102 -- Member Status inelgible
ELSE IF @StartDate<dateadd(DAY, 1, getdate())
    RETURN -103 --Reservation date before next 24 hours
ELSE IF @StartDate>dateadd(DAY, 7, getdate())
    RETURN -104
ELSE IF DATEPART(HOUR,@StartDate)<7
    RETURN -105 --Booking before 7am

我想知道是否可以将这些多个 return 一次全部设置为 return 或其他方式,因为检查一个错误然后 return 当可能存在多个错误时,这意味着每个错误只会在更正前一个错误后才会出现。

如果您由于要求限制而无法使用 return 代码,那么此答案将无法帮助您解决 return 多个错误。

如评论讨论中所述,存储过程不能 return 多个 return 代码,它只能 return 一个整数。

以下是关于该主题的文档参考:

https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/return-data-from-a-stored-procedure?view=sql-server-ver15#returning-data-using-a-return-code


但是,您可以做的是 return 多条错误消息,如果检测到任何错误,您可以 return 一个错误的 return 代码。可能有更简洁的方法来执行此操作,但这是可以完成的一种方法:

CREATE PROCEDURE dbo.usp_Whosebug_Answer (
    @Age tinyint,
    @StartDate datetime,
    @MemberNRIC int
)
AS
BEGIN
    DECLARE @errorStatus bit = 0;

    IF (@Age NOT BETWEEN 22 and 65)
    BEGIN;
        RAISERROR('Age Criteria not met',16,1) WITH NOWAIT;
        SET @errorStatus = 1;
    END;

    IF ((SELECT mem_status FROM Member WHERE mem_nric = @MemberNRIC) <> 'Active')
    BEGIN;
        RAISERROR('Member Status inelgible',16,1) WITH NOWAIT;
        SET @errorStatus = 1;
    END;

    IF (@StartDate < DATEADD(DAY, 1, GETDATE()))
    BEGIN;
        RAISERROR('Reservation date before next 24 hours',16,1) WITH NOWAIT;
        SET @errorStatus = 1;
    END;

    IF (@StartDate > DATEADD(DAY, 7, GETDATE()))
    BEGIN;
        RAISERROR('Reservation date more than 7 days in future',16,1) WITH NOWAIT;
        SET @errorStatus = 1;
    END;

    IF (DATEPART(HOUR, @StartDate) < 7)
    BEGIN;
        RAISERROR('Booking before 7am',16,1) WITH NOWAIT;
        SET @errorStatus = 1;
    END;

    IF (@errorStatus = 1)
    BEGIN;
        RETURN -1;
    END;
END;
GO

DECLARE @returnCode int;
EXEC @returnCode = dbo.usp_Whosebug_Answer @Age = 21, @StartDate = '2021-11-30', @MemberNRIC = 0;
SELECT @returnCode;

在这种情况下使用 RAISERROR 而不是其他选项的原因:

  • PRINT - 没有 return 错误代码只有消息
  • TRY/CATCH - 在这里不起作用,因为我们想收集多个错误,然后 return 所有错误。在这个例子中,我们使用严重级别 16,任何超过 11 的级别都会将执行转移到 CATCH 块,这不是我们想要的。
  • THROW - 虽然此命令确实使用了相同的严重级别 16,但它确实停止了存储过程的执行。所以问题类似于使用 TRY/CATCH 块。