2013-02-13 10 views
3

xample:什麼是存儲過程中使用VARCHAR輸出參數 - 不能 '返回@myvarchar',但可以 '選擇@myvarchar'

CREATE PROCEDURE dbo.sp_Delete (@p1 INT, @p2 VARCHAR(10) OUTPUT) 
AS 
    [email protected] will have calculations done and get a value for @p2 
    SET @p2 = 'test' 
    RETURN @p2 

測試:

DECLARE @p2 VARCHAR(100) 
EXEC sp_Delete 
    @p1 = N'1', 
    @p2 = N'' 

錯誤:

Conversion failed when converting the varchar value 'test' to data type int. 

但是 您可以這樣做:

ALTER PROCEDURE dbo.sp_Delete (@p1 INT) 
AS 
    [email protected] will have calculations done and get a value for @p2 
    SELECT 'test' 


    EXEC sp_Delete 
     @p1 = N'1' 

所以我的問題是,如果它不能使用「return @myvar」,那麼使用varchar類型的OUTPUT參數(注意我不會質疑int類型的輸出參數)有什麼用處是一個varchar。你可以「選擇@myvar」。 我想弄清楚我做錯了什麼,因爲我認爲我不明白使用特定的varchar輸出變量。

回答

3

你混淆了兩兩件事,返回值和輸出參數。

RETURN是sp執行的「整體」狀態,而OUTPUT參數允許您發回在您的過程中計算出的多個值。

此外,對於輸出參數發送回自己的價值,你應該指定OUTPUT關鍵字

declare @p2 varchar(100) 
exec sp_Delete 
@p1=N'1', 
@[email protected] OUTPUT -- first @p2 is then sp_parameter name, second is the @p2 variable from you outer batch 

select @p2 

可以

CREATE PROCEDURE TestProc 
@P1 INT, 
@P2 VARCHAR(10) OUTPUT 
AS 
BEGIN 
    SET @P2='SOME VALUE' 
    RETURN @P1 
END 
GO 
DECLARE @R INT, @P VARCHAR(10) 
EXEC @R=TestProc @P1=1, @[email protected] OUT --OUT is short for OUTPUT, you can use either one 
SELECT @R, @P 

----------------- 
1, 'SOME VALUE' 

不使用的輸出與OUTPUT參數混合返回值keywourd你」我有

DECLARE @R INT, @P VARCHAR(10) 
EXEC @R=TestProc @P1=1, @[email protected] -- notice the missing OUTPUT 
SELECT @R, @P --was not assigned in this batch so is NULL 

----------------- 
1, NULL 
4

輸出變量與返回值不同。返回值始終是一個整數。你可以檢索它想:

exec @retval = dbo.MyStoredProcedure 

當輸出參數就像檢索:

exec dbo.MyStoredProcedure @par_out output 

在你的情況,省略return聲明。 set @par_out = 'value'足以將輸出參數返回給調用代碼。

+0

當我嘗試此exec sp_Delete @ p1 = N'1',@ p2輸出,我得到消息必須聲明標量變量「@ p2」。 – 2013-02-13 10:02:10

+0

然後聲明變量f.e. '聲明@x varchar(50); exec sp_Delete @ p1 = N'1',@ p2 = @ x輸出;' – Andomar 2013-02-13 10:06:31

4

RETURN只能返回int的值。您不需要使用RETURN,其實,只要忽略它:

create PROCEDURE dbo.sp_Delete (
@p1 int, 
@p2 varchar(10) OUTPUT 
) 
AS 
[email protected] will have calculations done and get a value for @p2 
set @p2 = 'test' 

...

declare @p1 int, @p2 varchar(100) 
SELECT @p2 = '', @p1 = 1 
exec sp_Delete 
@p1, 
@p2 OUTPUT 

select @p2 
+0

當我嘗試這個時得到空... – 2013-02-13 10:01:39

+0

@PeterPitLock查看更新的答案 – 2013-02-13 10:08:48