一次处理多个存储过程状态
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 一个整数。
以下是关于该主题的文档参考:
但是,您可以做的是 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
块。
我不确定是否有办法处理多个 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 一个整数。
以下是关于该主题的文档参考:
但是,您可以做的是 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
块。