【问题标题】:Navigating the results of a stored procedure via a cursor using T-SQL使用 T-SQL 通过游标导航存储过程的结果
【发布时间】:2010-11-20 18:30:48
【问题描述】:

由于遗留的报告生成系统,我需要使用游标来遍历存储过程的结果集。系统通过 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

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

谢谢。

【问题讨论】:

    标签: tsql stored-procedures cursor


    【解决方案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')
    

    【讨论】:

    • INSERT INTO ... EXEC ... 语法应该可以解决问题。谢谢!无法使用表值函数 - 旧系统使用的是兼容级别 6.5。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以在临时表中执行你的 SP,然后用游标遍历临时表

      创建表#temp(列)

      插入#temp exec my_stored_proc ....

      执行光标工作

      删除表#temp

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2018-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多