Return 从存储过程到另一个存储过程的结果
Return results from stored proc to another stored proc
我有一个存储过程 - [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] 的结果:
但返回结果如下:
您的问题是您试图将存储过程用作函数。存储过程 returns 一个数值,0 表示成功,或另一个表示错误的值。
函数不允许调用 EXEC
之类的东西,但是,您 可以 将存储过程的变量定义为 OUT
或 OUTPUT
(取决于需要)在你的情况下,你似乎只需要 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
只是 returns 从 Procedure1
捕获的结果。获得第一个过程的结果后,您可以继续使用它们。
我有一个存储过程 - [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] 的结果:
但返回结果如下:
您的问题是您试图将存储过程用作函数。存储过程 returns 一个数值,0 表示成功,或另一个表示错误的值。
函数不允许调用 EXEC
之类的东西,但是,您 可以 将存储过程的变量定义为 OUT
或 OUTPUT
(取决于需要)在你的情况下,你似乎只需要 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
只是 returns 从 Procedure1
捕获的结果。获得第一个过程的结果后,您可以继续使用它们。