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


95

在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

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

Answers:


191

您可以使用三种方式: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会转换为零。

OUTPUT PARAMETER
可以使用输出参数:

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 

输出参数只能返回一个值,但可以是任何数据类型

结果 集的RESULT SET使程序类似于:

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 

结果集可以有许多行和许多数据类型的列


5
请注意,即使仅返回一条记录,结果集方法也需要使用此表/插入。我一直在寻找直接进入变量的快捷方式,但是没有一个。
goodeye 2014年

多行结果中是否可以使用“返回值”和“输出参数”方法?
ji-ruh

@ ji-ruh,存储过程可以使用一个,一个,一个或多个或全部:结果集,返回输出参数和/或返回值
KM。

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

-结果-

在此处输入图片说明


如何在php中获得此结果?
HagaHood

3

您需要使用返回值。

DECLARE @SelectedValue int

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

然后,您可以这样称呼它:

EXEC GetMyInt OUTPUT @SelectedValue

2

尝试这样做:

EXEC @SelectedValue = GetMyInt

7
这是不正确的。除非在SPROC中指定,否则SELECT语句不会成为SPROC的返回值。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.