将结果从存储的过程返回到另一个存储的过程

时间:2020-10-27 17:16:01

标签: sql sql-server stored-procedures

我有一个存储的proc-[dbo]。[DynamicPivotTableInSql1],我需要从另一个存储的proc中调用它并继续进行进一步的查询创建。我看到存储的proc [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

以下是执行存储的proc [dbo]的结果。[DynamicPivotTableInSql1]: enter image description here

但是下面是返回的结果: enter image description here

1 个答案:

答案 0 :(得分: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捕获的结果。获得第一个过程的结果后,就可以继续使用它们。