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

Dav*_*vid 93 t-sql select stored-procedures

在T-SQL中,这是允许的:

DECLARE @SelectedValue int
SELECT @SelectedValue = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1
Run Code Online (Sandbox Code Playgroud)

因此,有可能获得SELECT的值并将其填充到变量中(显然它是标量).

如果我在存储过程中放入相同的选择逻辑:

CREATE PROCEDURE GetMyInt
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1
Run Code Online (Sandbox Code Playgroud)

我可以获取此存储过程的输出并将其填充到变量中吗?

就像是:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt
Run Code Online (Sandbox Code Playgroud)

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

KM.*_*KM. 188

您可以使用三种方法: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
Run Code Online (Sandbox Code Playgroud)

现在称你的程序如下:

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC @SelectedValue = GetMyInt @Param
PRINT @SelectedValue
Run Code Online (Sandbox Code Playgroud)

这只适用于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
Run Code Online (Sandbox Code Playgroud)

现在称你的程序如下:

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC GetMyInt @Param, @SelectedValue OUTPUT
PRINT @SelectedValue 
Run Code Online (Sandbox Code Playgroud)

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

结果 集的RESULT SET使程序如下:

CREATE PROCEDURE GetMyInt
( @Param     int)
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO
Run Code Online (Sandbox Code Playgroud)

使用它像:

DECLARE @ResultSet table (SelectedValue int)
DECLARE @Param int
SET @Param=1
INSERT INTO @ResultSet (SelectedValue)
    EXEC GetMyInt @Param
SELECT * FROM @ResultSet 
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,即使只返回一个记录,结果集方法也需要此表/插入使用.我正在寻找一个直接进入变量的快捷方式,但没有一个. (5认同)