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

Posted

技术标签:

【中文标题】T-SQL 获取存储过程的 SELECTed 值【英文标题】:T-SQL get SELECTed value of stored procedure 【发布时间】:2011-02-22 06:53:50 【问题描述】:

在 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

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

【问题讨论】:

【参考方案1】:

您可以使用三种方式: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 

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

【讨论】:

请注意,结果集方法需要此表/插入用法,即使只返回一条记录。我一直在寻找直接进入变量的快捷方式,但没有。 是否可以在多行结果中使用“返回值”和“输出参数”的方法? @ji-ruh,存储过程可以使用一个、无、部分或全部:结果集、返回输出参数和/或返回值【参考方案2】:

还有一种组合方式,可以使用返回值和记录集:

--存储过程--

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

--结果--

【讨论】:

我如何在 php 中得到这个结果?【参考方案3】:

您需要使用返回值。

DECLARE @SelectedValue int

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

那你这样称呼它:

EXEC GetMyInt OUTPUT @SelectedValue

【讨论】:

【参考方案4】:

试试这个:

EXEC @SelectedValue = GetMyInt

【讨论】:

这是不正确的。除非在 SPROC 中指定,否则 SELECT 语句不会成为 SPROC 的返回值。

以上是关于T-SQL 获取存储过程的 SELECTed 值的主要内容,如果未能解决你的问题,请参考以下文章

SQL server学习——T-SQL编程之存储过程

如何从 T-SQL 存储过程返回表

T-SQL存储过程

T-SQL存储过程

接受多个 Id 值的 T-SQL 存储过程

T-SQL 带参数存储过程