【问题标题】:Get scalar value from SELECT statement in stored proc, from within a stored proc从存储过程中的 SELECT 语句中获取标量值
【发布时间】:2011-07-10 12:32:27
【问题描述】:

我知道从存储的过程中返回标量值的首选方法是使用RETURN 或OUTPUT 参数。但是假设我有一个使用 select 语句返回值的存储过程:

CREATE PROC spReturnNumber AS

SELECT 1

是否可以从另一个存储过程中获取此值?

CREATE PROC spCheckNumber AS

EXEC spReturnNumber -- <-- get the return value here?

澄清:我需要一个不需要使用OUTPUT 参数或使用RETURN 来返回值的解决方案。

提前致谢。

【问题讨论】:

  • 我不使用sql-server,所以无法具体回答,但是对于PostgreSQL,答案是是。我想这里也是如此......但它应该很容易测试。 :) 事实上,可能比发布问题更容易(假设 你 可以访问 sql-server)
  • 愿意分享如何在 PostgreSQL 中执行此操作?

标签: sql sql-server stored-procedures


【解决方案1】:

您可以使用insert-exec 将存储过程的结果存储在表中:

declare @t table (col1 int)
insert @t exec spReturnNumber
return (select col1 from @t)

表的定义必须与存储过程的结果集相匹配。

【讨论】:

    【解决方案2】:

    使用OUTPUT 参数代替SELECT 参数(或补充,如果其他应用程序使用此过程)。

    ALTER PROCEDURE dbo.spReturnNumber
        @Number INT OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON;
    
        SET @Number = 1;
        SELECT @Number;
    END
    GO
    
    CREATE PROCEDURE dbo.spCheckNumber
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @Number INT;
        EXEC dbo.spReturnNumber @Number = @Number;
        SELECT @Number;
    END
    GO
    

    如果您无法更改原始过程,但您知道其输出将保持静态,则可以使用 #temp 表。

    CREATE PROCEDURE dbo.spCheckNumber
    AS
    BEGIN
        SET NOCOUNT ON;
    
        CREATE TABLE #n(i INT);
        INSERT #n(i) EXEC dbo.spReturnNumber;
    
        DECLARE @Number INT;
        SELECT @Number = i FROM #n;
    END
    GO
    

    【讨论】:

    • 谢谢,但我需要一个不需要更改源存储过程 (spReturnNumber) 的解决方案。它所做的只是使用SELECT 返回标量。
    • 您应该在问题中说明这一点,因为您将获得的大多数建议将涉及更改源存储过程。通过使用 #temp 表或其他方式在调用者中处理此问题的效率要低得多。
    • 对不起,我以为第一句话涵盖了我已经考虑过使用OUTPUT 和RETURN。但我更新了 OP 以澄清。
    • 现在与此问题无关,因为您已经选择了答案,但是将来我仍然认为您应该说明您的要求(“我无法更改源程序”)而不是您如何认为你会完成你的要求(“我不想使用 RETURN 或 OUTPUT”)。如果有人提出不同的解决方案 x,需要修改原始过程,您是否会将问题更新为“我不想要 RETURN 或 OUTPUT 或 x”?
    • 是的,我明白了我不清楚的地方。你是说我不应该更新我的问题吗?抱歉,我不确定你在说什么我应该做不同的事情(就像我说的,我知道我不清楚的地方,所以我正在更新问题以使其更清楚 - 但除此之外?)跨度>
    【解决方案3】:

    您无法从“父”过程中获取 SELECT 值,但您可以像这样获取返回值:

    CREATE PROC A AS
    BEGIN
        DECLARE @ret int
    
        EXEC @ret = spReturnNumber
    
        RETURN @ret
    END
    

    【讨论】:

    • 是的,你只能得到RETURN值,没有别的。
    • 是的,它仅在您RETURN 值时有效,并且您不应将RETURN 用于数据,仅用于错误代码/状态。
    【解决方案4】:

    如果您无法更改被调用的 proc .. 将结果集放在临时表 [或表变量] 中:

    CREATE TABLE #results (val INT)
       DECLARE @someval int
       INSERT #results
         EXEC dbo.spCheckNumber 
    
       SELECT @someval =val from  #results
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      相关资源
      最近更新 更多