【问题标题】:Get select results from recursive stored procedure从递归存储过程中获取选择结果
【发布时间】:2015-05-20 23:01:28
【问题描述】:

我有一个递归存储过程,它在我的层次结构表中查找错误。由于它是递归的,如果它发现一个错误,它会在该递归调用中被选中。因此,递归调用中有许多选择。我的问题是如何在 .NET 应用程序中捕获所有这些结果?我可以在 SSMS 中看到这个结果,但在 .NET 中我只能看到最新选择的最后一个结果。

我的过程(由于简单而省略了大部分代码 - 我只留下了基础知识,即发现错误时的递归选择):

CREATE PROCEDURE MyProcedure
@Node HierarchyID,
@Iterator int
AS



IF -- some condition
BEGIN
  SELECT 'ERROR: ' + @ChildNumber + @Node
END

OPEN ChildRowsCursor

WHILE (@Iterator <= 100)
	BEGIN	
		FETCH NEXT FROM ChildRowsCursor INTO @CurrentChildNode
		EXEC dbo.MyProcedure @CurrentChildNode, @Iterator		
		SET @Iterator = @Iterator + 1
	END
	


CLOSE ChildRowsCursor
DEALLOCATE ChildRowsCursor

END

编辑:

为了调用存储过程,我使用表适配器:

DataLayer.MyTableAdapters adapter = new DataLayer.MyTableAdapters();
adapter.GetAllErrors();

【问题讨论】:

  • 您能否编辑您的问题并添加用于调用 SP 并捕获结果的 .Net 代码。

标签: sql .net sql-server sql-server-2008


【解决方案1】:

使用临时表选择结果:

CREATE PROCEDURE MyProcedure
@Node HierarchyID,
@Iterator int
AS
IF OBJECT_ID('tempdb..#result')  IS NULL
CREATE TABLE #result (res VARCHAR(1000));

IF -- some condition
BEGIN
  INSERT INTO #result VALUES ( 'ERROR: ' + @ChildNumber + @Node);
END

OPEN ChildRowsCursor

WHILE (@Iterator <= 100)
    BEGIN   
        FETCH NEXT FROM ChildRowsCursor INTO @CurrentChildNode
        EXEC dbo.MyProcedure @CurrentChildNode, @Iterator       
        SET @Iterator = @Iterator + 1
    END



CLOSE ChildRowsCursor
DEALLOCATE ChildRowsCursor

SELECT * FROM #result;

END

【讨论】:

  • 我可以检查这个临时表是否存在吗?因此,它不会在每次递归调用时再次创建。
  • 确定,修改答案
  • 存储过程结束时会自动删除这个临时表吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2010-12-13
  • 2018-12-27
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
相关资源
最近更新 更多