【问题标题】:T-SQL get SELECTed value of stored procedureT-SQL 获取存储过程的 SELECTed 值
【发布时间】: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

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

【问题讨论】:

    标签: tsql stored-procedures select


    【解决方案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 的返回值。
      猜你喜欢
      • 2018-10-03
      • 2013-05-28
      • 2011-05-04
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      相关资源
      最近更新 更多