2010-05-21 29 views
86

的設定值在T-SQL,這是允許的:T-SQL獲得存儲過程

DECLARE @SelectedValue int 
SELECT @SelectedValue = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1 

所以,有可能得到一個變量,SELECT和東西它的值(前提是該標量,明顯)。

如果我把同樣的選擇邏輯在存儲過程:

CREATE PROCEDURE GetMyInt 
AS 
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1 

我可以在一個變量這個存儲過程之類的東西它的輸出?

喜歡的東西:

DECLARE @SelectedValue int 
SELECT @SelectedValue = EXEC GetMyInt 

(我知道上面的語法是不允許的,因爲我試過!)

+0

似乎有種很難根據要求回答您的問題時選擇「最佳」答案。 我在這裏選擇了最詳細的一個。謝謝。 – David 2010-05-21 12:49:37

回答

170

有三種方法可以使用:返回值,輸出參數和結果集

另外,如果你注意使用模式:SELECT @Variable=column FROM table ...

如果查詢返回多行,則您的@Variable將只包含查詢返回的最後一行的值。

返回值
因爲你的查詢返回一個int領域,至少根據您如何命名它。您可以使用這一招:

CREATE PROCEDURE GetMyInt 
(@Param int) 
AS 
DECLARE @ReturnValue int 

SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param 
RETURN @ReturnValue 
GO 

,現在叫喜歡你的程序:

DECLARE @SelectedValue int 
     ,@Param   int 
SET @Param=1 
EXEC @SelectedValue = GetMyInt @Param 
PRINT @SelectedValue 

這隻會爲INT的工作,因爲RETURN只能返回一個int值和空值轉換成零。

輸出參數
您可以使用輸出參數:

CREATE PROCEDURE GetMyInt 
(@Param  int 
,@OutValue int OUTPUT) 
AS 
SELECT @OutValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param 
RETURN 0 
GO 

現在打電話給你的程序,如:

DECLARE @SelectedValue int 
     ,@Param   int 
SET @Param=1 
EXEC GetMyInt @Param, @SelectedValue OUTPUT 
PRINT @SelectedValue 

輸出參數只能返回一個值,而可以是任何數據類型

結果集 對結果集進行的過程,如:

CREATE PROCEDURE GetMyInt 
(@Param  int) 
AS 
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param 
RETURN 0 
GO 

這樣使用它:

DECLARE @ResultSet table (SelectedValue int) 
DECLARE @Param int 
SET @Param=1 
INSERT INTO @ResultSet (SelectedValue) 
    EXEC GetMyInt @Param 
SELECT * FROM @ResultSet 

結果集可以有許多行和任何數據類型

+2

請注意,即使只返回一條記錄,結果集方法也需要此表/插入用法。我一直在尋找一個快捷方式到一個變量,但沒有一個。 – goodeye 2014-06-09 18:33:51

+0

是否可以在多行結果中使用「返回值」和「輸出參數」方法? – 2016-07-12 13:37:38

+0

@ ji-ruh,存儲過程可以使用one,none,some或all:結果集,返回輸出參數,和/或返回值 – 2016-07-12 15:35:32

2

你需要使用返回值。

DECLARE @SelectedValue int 

CREATE PROCEDURE GetMyInt (@MyIntField int OUTPUT) 
AS 
SELECT @MyIntField = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1 

然後調用它像這樣:

EXEC GetMyInt OUTPUT @SelectedValue 
+0

你不在乎! 謝謝。 – David 2010-05-21 09:50:23

+0

爲什麼我不能將此標記爲10分鐘的答案? SO是任意規則之王。 – David 2010-05-21 09:57:39

2

儘量做到這一點的許多列:

EXEC @SelectedValue = GetMyInt 
+6

這是不正確的。除非在SPROC中指定,否則SELECT語句不會成爲SPROC的返回值。 – 2013-02-26 01:40:00

4

還有一個組合,你可以使用返回值有一個記錄:

--Stored Procedure--

CREATE PROCEDURE [TestProc] 

AS 
BEGIN 

    DECLARE @Temp TABLE 
    (
     [Name] VARCHAR(50) 
    ) 

    INSERT INTO @Temp VALUES ('Mark') 
    INSERT INTO @Temp VALUES ('John') 
    INSERT INTO @Temp VALUES ('Jane') 
    INSERT INTO @Temp VALUES ('Mary') 

    -- Get recordset 
    SELECT * FROM @Temp 

    DECLARE @ReturnValue INT 
    SELECT @ReturnValue = COUNT([Name]) FROM @Temp 

    -- Return count 
    RETURN @ReturnValue 

END 

--Calling代碼 -

DECLARE @SelectedValue int 
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue 

--Results--

enter image description here

+0

如何在php中獲得此結果? – HagaHood 2017-01-12 14:33:42