看到RETURN的返回值不同,代表意義各不同,能過查找,得出以下結論:
RETURN語句會導致過程立即退出。考察下面的例子:
CREATE PROCEDURE check_tables
(@who VARCHAR(30))
AS
IF EXISTS(SELECT name FROM Philosophers WHERE name=@who)
BEGIN
PRINT “In the Philosophers Table”
RETURN
END
IF EXISTS(SELECT author_name FROM Authors WHERE author_name=@who)
BEGIN
PRINT “In the Authors Table”
RETURN
END
PRINT “Not in any tables!”
RETURN
該過程檢查了兩個表以判斷一個人是否是哲學家或作者。假如提供的名稱即不是哲學家也不是作者,打印文本“Not in any tables!”。RETURN語句會在一旦存在匹配時,立刻退出該過程。
比如,假定你使用參數“Plato”來執行該過程。首先使用表Philosophers來檢測是否存在“Plato”。由於該名字存在於該表中,所以過程打印文本”In the Philosophers table”,然后過程在執行到RETURN語句時,退出。
注意
你可以使用RETURN語句結束任何過程。這實際上並不完成任何事情。因為在任何情況下,過程總是要退出的。
當你在存儲過程而不是在批處理中使用RETURN語句時,你能夠返回一整數值。該整數值代表一個狀態碼。下面就是上面的例子經過改寫后,返回特定的整數值。
CREATE PROCEDURE check_tables
(@who VARCHAR(30))
AS
IF EXISTS(SELECT name FROM Philosophers WHERE name=@who)
BEGIN
RETURN(1)
END
IF EXISTS(SELECT author_name FROM Authors WHERE author_name=@who)
BEGIN
RETURN(2)
END
RETURN(3)
該過程完成和前面的那個過程相同的任務。然而當在表中發現該姓名時,並不打印信息,代替地,該過程使用RETURN語句來指明從那個表中找到該名稱。例如,假如你使用參數“James Joyce”來執行該過程時。存儲過程會返回值2,因為James Joyce在表Authors中,而不是在表Philosophers中。你可以在Active Server Page或其他的存儲過程中使用狀態值來確定該姓名所在的表。
當使用狀態值時,你必須使用對於1或小於-99的值。SQL Server使用值0來報告一個存儲過程的成功執行。它同時使用小於0對於-100的值來報告錯誤(參看表12。1以獲得SQL Server使用的狀態值的完全列表)。
| 值 |
意思 |
| 0 |
過程成功執行。 |
| -1 |
對象丟失。 |
| -2 |
發生數據類型錯誤。 |
| -3 |
處理過程被死鎖。 |
| -4 |
發生權限錯誤。 |
| -5 |
發生語法錯誤。 |
| -6 |
發生惡意用戶錯誤。 |
| -7 |
發生資源錯誤,比如空間不夠等。 |
| -8 |
遭遇非致命的內部問題。 |
| -9 |
遭遇系統限制。 |
| -10 |
發生致命的內部不穩定性。 |
| -11 |
發生致命的內部不穩定性。 |
| -12 |
表或索引被破壞。 |
| -13 |
數據庫被破壞。 |
| -14 |
發生硬盤錯誤。 |
| 包含在-15到-99之間的值有SQL Server保留以在將來使用。 |
|
表12.1 過程狀態值
注意
當你使用RETURN語句返回狀態值時,切記不要返回NULL值。這會導致錯誤的結果。
為了獲得在前面例子中過程返回的狀態值,你可以使用如下的語句:
DECLARE @conclusion INT
EXECUTE @conclusion=check_tables “James Joyce”
SELECT @conclusion
變量@conclusion用於保存狀態值。它必須定義成INT整數數據類型。當你執行存儲過程check_tables時,使用下面的語句將狀態值賦予該變量:
EXECUTE @conclusion=check_tables “James Joyce”
