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