4

従来のレポート生成システムのため、ストアドプロシージャからの結果セットをトラバースするにはカーソルを使用する必要があります。システムは、結果セットの各行からデータを印刷することによってレポート出力を生成します。レポートシステムのリファクタリングは、この問題の範囲をはるかに超えています。

私の知る限り、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

何かご意見は?カーソルを介してストアドプロシージャから結果セットをトラバースする他の方法を知っている人はいますか?

ありがとう。

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を使用して、プロシージャの結果をテーブル(temp #tableまたは@table変数にすることができます)にプッシュし、このテーブルの上にカーソルを開きます。リンクの記事では、この手法で発生する可能性のある問題について説明しています。ネストすることはできず、プロシージャの周囲でトランザクションを強制します。

于 2009-08-18T22:02:14.543 に答える
0

SPを一時テーブルで実行してから、カーソルで一時テーブルを反復処理することができます。

テーブルの作成#temp(列)

#temp execmy_stored_proc...に挿入します。

カーソル作業を実行します

ドロップテーブル#temp

于 2009-08-18T22:02:23.687 に答える