4

由于遗留报告生成系统,我需要使用游标来遍历存储过程的结果集。系统通过 PRINTing 结果集中每一行的数据来生成报告输出。重构报告系统超出了这个问题的范围。

据我所知,DECLARE CURSOR 语法要求其来源是 SELECT 子句。但是,我需要使用的查询存在于一个 1000 多行的存储过程中,该过程生成并执行动态 sql。

有谁知道将结果集从存储过程获取到游标中的方法?

我尝试了明显的:

Declare Cursor c_Data For my_stored_proc @p1='foo', @p2='bar'

作为最后的手段,我可​​以修改存储过程以返回它生成的动态 sql 而不是执行它,然后我可以将这个返回的 sql 嵌入到另一个字符串中,最后执行它。就像是:

Exec my_stored_proc @p1='foo', @p2='bar', @query='' OUTPUT
Set @sql = '
    Declare Cursor c_Data For ' + @query + '
    Open c_Data
    -- etc. - cursor processing loop etc. goes here '
Exec @sql

有什么想法吗?有谁知道通过游标从存储过程中遍历结果集的任何其他方法?

谢谢。

4

3 回答 3

8

您可以将存储过程中的结果放入临时表中,然后从中选择光标。

CREATE TABLE #myResults
(
    Col1 INT,
    Col2 INT
)

INSERT INTO #myResults(Col1,Col2)
EXEC my_Sp

DECLARE sample_cursor CURSOR
FOR
 SELECT
    Col1,
    Col2
 FROM
    #myResults

另一种选择可能是将存储过程转换为表值函数。

DECLARE sample_cursor CURSOR
FOR
  SELECT
     Col1,
     Col2
  FROM
     dbo.NewFunction('foo', 'bar')
于 2009-08-18T22:01:49.413 回答
1

您使用INSERT ... EXEC将过程的结果推送到表中(可以是临时 #table 或 @table 变量),然后在该表上打开光标。链接中的文章讨论了这种技术可能出现的问题:它不能嵌套,并且它强制围绕过程进行事务。

于 2009-08-18T22:02:14.543 回答
0

您可以将 SP 执行到临时表中,然后使用游标遍历临时表

创建表#temp(列)

插入#temp exec my_stored_proc ....

执行光标工作

删除表#temp

于 2009-08-18T22:02:23.687 回答