使用T-SQL经由光标导航的存储过程的结果(Navigating the results of a

2019-09-24 06:54发布

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

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

有谁知道的一种方式来获得结果从一个存储过程中设置成光标?

我尝试了很明显的:

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

有什么想法吗? 有谁知道任何其他方式来遍历结果通过光标从一个存储过程设置?

谢谢。

Answer 1:

您可以删除从存储过程的结果到一个临时表,并从你的光标选择。

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')


Answer 2:

您可以使用INSERT ... EXEC的过程的结果推到一个表(可以是临时#table或@table变量),在打开鼠标放在该表。 链接中的文章讨论了这一技术可能发生的问题:它不能被嵌套,并迫使周围的程序交易。



Answer 3:

你可以执行你的SP到一个临时表,然后遍历该临时表与光标

创建表#TEMP(列)

插入#TEMP EXEC my_stored_proc ....

执行光标工作

删除表#TEMP



文章来源: Navigating the results of a stored procedure via a cursor using T-SQL