2011-06-09 40 views
1

在測試procs的輸出值時,爲什麼最終的select @TestValOut返回0而不是null或空字符串?爲什麼這個簡單proc的輸出會改變數據類型?

我明白這樣做的正確方法是使用OUTPUT參數,所以真正的問題就變成了:爲什麼是@TestValOut設定值的數據類型,在執行一個整數?

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'Custom.test') AND type in (N'P', N'PC')) 
    DROP PROCEDURE Custom.test 
GO 

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1 
    ) 
As 
    Declare @TestValIn varchar(max) 
    select @TestValIn='asdf' 

GO 

BEGIN TRAN 

    Declare @TestValOut varchar(max) 
    set @TestValOut='ffff' 
    Exec @TestValOut=Custom.test @CurrentUserID=1 
    select @TestValOut 
ROLLBACK 

回答

4

在存儲過程中的返回值始終是一個整數,因爲事實上,你只能使用帶有返回值的整數。您看到0的事實意味着proc正確執行,這是SQL Server返回的值,告訴您執行的結果是什麼

爲了好玩,在proc中執行select 1/0,您將看到它被贏得' T爲0了

看到這裏

Is a return value of 0 always a success in stored procedures?

這裏是從答案的例子

CREATE PROC pr_test AS 
SELECT 1/0 

RETURN 0 
GO 

現在運行它

DECLARE @i INT 
exec @i = pr_test 

SELECT @i -- will be 0 

DROP PROC pr_test 

現在讓我們再做一次沒有return語句

CREATE PROC pr_test2 AS 
SELECT 1/0 

GO 

DECLARE @i INT 
exec @i = pr_test2 

SELECT @i -- will be - 6 

最好使用output parameter傳回的狀態和或消息

+0

我剛剛重讀了這個問題。我的壞評論 – 2011-06-09 18:18:38

+0

廢話,'@ TestValOut'獲取返回值而不是結果集 – SQLMenace 2011-06-09 18:19:40

+0

@ScottV:錯誤。 @TestValOut被分配了來自RETURN的值。存儲過程沒有結果集 – gbn 2011-06-09 18:19:59

1

@TestValOut分配的值由「RETURN」這樣返回:

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1 
    ) 
As 
    Declare @TestValIn varchar(max) 
    select @TestValIn='asdf' 

RETURN --defaults to zero, this is the value 
GO 

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1 
    ) 
As 
    Declare @TestValIn varchar(max) 
    select @TestValIn='asdf' 

RETURN 0 --this is the value 
GO 

存儲過程實際上並沒有做任何事情:沒有結果集。看到區別...

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1 
    ) 
As 

    select * from sys.objects 

    RETURN 42 --random value 
GO 

DECLARE @rtn int 
EXEC @rtn = Custom.test 
--you have the output of sys.objects now 
--and the scalar RETURN value 
SELECT @rtn 
0

您需要明確說出什麼樣的價值回報。默認爲0

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1 
    ) 
As 
    Declare @TestValIn varchar(max) 
    select @TestValIn='asdf' 

    RETURN 0 

GO 
+0

會發出警告:不能返回NULL – gbn 2011-06-09 18:22:39

+0

謝謝你讓我知道。更新爲返回0! – Akhil 2011-06-09 18:29:51

2

我認爲你要做的是使用輸出參數,這應該是這樣做的。

CREATE PROCEDURE Custom.test (
    @CurrentUserID INT = 1, 
    @TestValOut varchar(max) OUTPUT 
    ) 
As 
    select @TestValOut='asdf' 

GO 

BEGIN TRAN  
    Declare @TestValOut varchar(max) 
    Exec Custom.test @CurrentUserID=1, @TestValOut OUTPUT 
    select @TestValOut 
ROLLBACK 
+0

是的,這是真的。然而,問題承認情況是這樣的 - 但是尋找(n隱式)返回情況的推理。 – 2011-06-09 18:52:01

相關問題