Tsql 使用T-SQL通过游标导航存储过程的结果

Tsql 使用T-SQL通过游标导航存储过程的结果,tsql,stored-procedures,cursor,Tsql,Stored Procedures,Cursor,由于传统的报表生成系统,我需要使用游标遍历存储过程中的结果集。系统通过打印结果集中每一行的数据来生成报告输出。重构报告系统远远超出了这个问题的范围 据我所知,DECLARE CURSOR语法要求其源代码是SELECT子句。但是,我需要使用的查询存在于生成和执行动态sql的1000多行存储过程中 有人知道如何将结果集从存储过程中获取到游标中吗 我尝试了显而易见的方法: Declare Cursor c_Data For my_stored_proc @p1='foo', @p2='bar' 作为

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

据我所知,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
有什么想法吗?有人知道通过游标从存储过程遍历结果集的其他方法吗


谢谢。

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

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

用于将过程的结果推送到表中的变量可以是temp表或@table,在该表上打开光标。链接中的文章讨论了此技术可能出现的问题:它不能嵌套,并且会强制围绕过程执行事务。

您可以将SP执行到临时表中,然后用光标在临时表上迭代

创建表临时列

将我的存储过程插入临时执行程序

执行光标工作


将表格温度插入到。。。执行。。。语法应该起作用。谢谢无法使用表值函数-旧系统正在使用兼容性级别6.5。