T-SQL 获取存储过程的 SELECTed 值
Posted
技术标签:
【中文标题】T-SQL 获取存储过程的 SELECTed 值【英文标题】:T-SQL get SELECTed value of stored procedure 【发布时间】:2011-02-22 06:53:50 【问题描述】:在 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
(我知道上面的语法是不允许的,因为我试过了!)
【问题讨论】:
【参考方案1】:您可以使用三种方式: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
结果集可以包含任意数据类型的多行多列
【讨论】:
请注意,结果集方法需要此表/插入用法,即使只返回一条记录。我一直在寻找直接进入变量的快捷方式,但没有。 是否可以在多行结果中使用“返回值”和“输出参数”的方法? @ji-ruh,存储过程可以使用一个、无、部分或全部:结果集、返回输出参数和/或返回值【参考方案2】:还有一种组合方式,可以使用返回值和记录集:
--存储过程--
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 中得到这个结果?【参考方案3】:您需要使用返回值。
DECLARE @SelectedValue int
CREATE PROCEDURE GetMyInt (@MyIntField int OUTPUT)
AS
SELECT @MyIntField = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1
那你这样称呼它:
EXEC GetMyInt OUTPUT @SelectedValue
【讨论】:
【参考方案4】:试试这个:
EXEC @SelectedValue = GetMyInt
【讨论】:
这是不正确的。除非在 SPROC 中指定,否则 SELECT 语句不会成为 SPROC 的返回值。以上是关于T-SQL 获取存储过程的 SELECTed 值的主要内容,如果未能解决你的问题,请参考以下文章