在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
(我知道上面的语法是不允许的,因为我试过了!)
答案 0 :(得分:183)
您可以使用三种方法: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
结果集可以包含许多行和任何数据类型的多列
答案 1 :(得分: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
- 结果 -
答案 2 :(得分:2)
您需要使用返回值。
DECLARE @SelectedValue int
CREATE PROCEDURE GetMyInt (@MyIntField int OUTPUT)
AS
SELECT @MyIntField = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1
然后你这样称呼它:
EXEC GetMyInt OUTPUT @SelectedValue
答案 3 :(得分:2)
尝试这样做:
EXEC @SelectedValue = GetMyInt