T-SQL获取存储过程的SELECTed值

时间:2010-05-21 09:45:00

标签: tsql stored-procedures select

在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

(我知道上面的语法是不允许的,因为我试过了!)

4 个答案:

答案 0 :(得分:183)

您可以使用三种方法:RETURN值,OUTPUT参数和结果集

另外,请注意您是否使用该模式: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值,而null则转换为零。

输出参数
您可以使用输出参数:

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 

结果集可以包含许多行和任何数据类型的多列

答案 1 :(得分:4)

还有一个组合,你可以使用带有记录集的返回值:

- 存储过程 -

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

- 致电代码 -

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

- 结果 -

enter image description here

答案 2 :(得分:2)

您需要使用返回值。

DECLARE @SelectedValue int

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

然后你这样称呼它:

EXEC GetMyInt OUTPUT @SelectedValue

答案 3 :(得分:2)

尝试这样做:

EXEC @SelectedValue = GetMyInt