我不確定是否有辦法處理多個退貨狀態
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
我想知道是否有辦法將這些多次回傳設定為一次回傳或其他方式,因為檢查一個錯誤然后在可能存在多個錯誤時回傳效率低下,這意味著每個錯誤只會浮出水面前面的更正后。
uj5u.com熱心網友回復:
如果由于要求限制而無法使用回傳代碼,那么此答案將無法幫助您回傳多個錯誤。
正如評論討論中所述,存盤程序不能回傳多個回傳碼,它只能回傳一個整數。
這是對有關該主題的檔案的參考:
https://docs.microsoft.com/en-us/sql/relational-databases/stored-procedures/return-data-from-a-stored-procedure?view=sql-server-ver15#returning-data-using-回傳碼
但是,您可以做的是回傳多個錯誤訊息,如果檢測到任何錯誤,您可以回傳錯誤的回傳代碼。可能有一種更簡潔的方法可以做到這一點,但這是一種可以做到的方法:
CREATE PROCEDURE dbo.usp_StackOverflow_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_StackOverflow_Answer @Age = 21, @StartDate = '2021-11-30', @MemberNRIC = 0;
SELECT @returnCode;
RAISERROR在這種情況下使用而不是其他選項的原因:
PRINT- 不回傳錯誤代碼僅訊息TRY/CATCH- 在這里不起作用,因為我們要收集多個錯誤,然后將它們全部回傳。在這個例子中,我們使用嚴重級別 16,任何 11 的都會將執行轉移到CATCH塊,這不是我們想要的。THROW- 雖然此命令確實使用相同的嚴重性級別 16,但它確實停止了存盤程序的執行。所以這個問題類似于使用TRY/CATCH塊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/363538.html
標籤:sql sql-server 查询语句 存储过程
