2010-05-21 27 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