【问题标题】:Return results from stored proc to another stored proc将结果从存储过程返回到另一个存储过程
【发布时间】:2020-10-27 17:16:01
【问题描述】:

我有一个存储过程 - [dbo].[DynamicPivotTableInSql1] 我需要从另一个存储过程调用并继续进一步创建查询。我看到存储的过程 [dbo].[DynamicPivotTableInSql1] 正在成功执行,但没有返回结果。如果我在这里做错了什么,请告诉我。

我最近发布了一个相关问题,但进一步分析发现结果没有返回到调用存储过程是问题。

我需要在[dbo].[DynamicPivotTableInSql1]中使用动态sql,因为查询相当复杂,我必须根据某些输入参数扩展where子句。我只贴了一部分。

感谢您的帮助和时间!

CREATE PROCEDURE [dbo].[DynamicPivotTableInSql1]

AS
BEGIN
DECLARE @colsPivot AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX),
@str_comp1 AS NVARCHAR(MAX),
@str_comp2 AS NVARCHAR(MAX) 


SET @str_comp1 = ' comp1 IN (''Capacity'') and '
SET @str_comp2 = ' comp2 IN (''Refinery'') '

SET @colsPivot = 'SELECT STUFF((SELECT  '','' 
                      + quotename(link_id)
                    from [dbo].[test_excel_poc_head] t
WHERE ' + @str_comp1 +  @str_comp2 + '
FOR XML PATH(''''), TYPE ).value(''.'', ''NVARCHAR(MAX)'') 
,1,1,'''')'

EXEC(@colsPivot)
END

调用过程如下:

BEGIN
DECLARE @colsPivot1 AS NVARCHAR(MAX),
@return_result  AS NVARCHAR(MAX) 

EXEC    @return_result = [dbo].[DynamicPivotTableInSql1]
print('Return Value: ' + @return_result)
END

下面是执行存储过程[dbo].[DynamicPivotTableInSql1]的结果:

但是下面是返回的结果:

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

    您的问题是您试图将存储过程用作函数。存储过程返回一个数值,0 表示成功,或者另一个表示错误的值。

    函数不允许调用像EXEC 这样的东西,但是,您可以将存储过程的变量定义为OUTOUTPUT(取决于需要),在您的情况下,看来你只需要OUT

    下面是一个示例,说明如何做到这一点:

    /* Create base procedure with an OUT parameter */
    CREATE OR ALTER PROCEDURE dbo.Procedure1 (
        @results xml OUT -- OUT parameter to return the results.
    )
    AS
    BEGIN
    
        /* Build dynamic SQL statement */
        DECLARE @statement nvarchar(1000) = 'SET @dynamicResults = ( SELECT * FROM Misc FOR XML PATH( '''' ), TYPE );';
    
        /* Execute the dynamic SQL statement and capture results into the @results OUT parameter */
        EXEC sp_executesql @statement, N'@dynamicResults xml OUT', @dynamicResults = @results OUT;
    
    END
    GO
    
    /* Create a procedure that captures the results from the base procedure */
    CREATE OR ALTER PROCEDURE dbo.Procedure2
    AS
    BEGIN
    
        /* Declare variable to capture the results from Procedure1 */
        DECLARE @results xml;
    
        /* Call Procedure1 and capture its results */
        EXEC dbo.Procedure1 @results OUT;
    
        /* Return the results from Procedure1 */
        SELECT @results AS ResultsFromProcedure1;
    
    END
    GO
    
    /* Call Procedure2 */
    EXEC dbo.Procedure2;
    

    在本例中调用Procedure2 只会返回从Procedure1 捕获的结果。获得第一个过程的结果后,您可以继续使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-21
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多