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

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

DECLARE @SelectedValue int SELECT @SelectedValue = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1 

所以,有可能得到一个SELECT的值,并将其填入一个variables(显然它是标量)。

如果我把相同的select逻辑存储在一个存储过程中:

 CREATE PROCEDURE GetMyInt AS SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1 

我可以得到这个存储过程的输出,并将其填入一个variables?

就像是:

 DECLARE @SelectedValue int SELECT @SelectedValue = EXEC GetMyInt 

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

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

另外,注意,如果你使用的模式: SELECT @Variable=column FROM table ...

如果查询返回多行,那么@Variable将只包含查询返回的最后一行的值。

返回值
因为你的查询返回一个int字段,至less根据你的命名方式。 你可以使用这个技巧:

 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 

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

结果集的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 

结果集可以有多行和多列的任何数据types

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

– 存储过程 –

 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 

–Results–

在这里输入图像说明

你需要使用返回值。

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

那么你这样称呼它:

 EXEC GetMyInt OUTPUT @SelectedValue 

试试这个:

 EXEC @SelectedValue = GetMyInt