0

ストアドプロシージャのリストを含むテーブルがあります。

カーソルを使用してループし、各ストアドプロシージャの結果を呼び出してキャプチャしています(すべて0または1を返します)。

ので、私は持っています:

DECLARE @PROC_ID INT,
        @PROC_NAME VARCHAR(50)

SELECT *
INTO #MY_PROCS
FROM TABLE_PROCS

DECLARE MY_CURSOR CURSOR FOR
SELECT PROC_ID, PROC_NAME
FROM TABLE_PROCS

OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @PROC_ID, @PROC_NAME

WHILE @@FETCH_STATUS = 0
BEGIN
  SELECT @PROC_RESULT = .......

  UPDATE #MY_PROCS SET PROC_RESULT = @PROC_RESULT WHERE PROC_ID = @PROC_ID
END

CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR

DROP TABLE #MY_PROCS

私はカーソルで読んでいました、そして私はそれを可能な限り設定するべきであると読みましREAD ONLYNO LOCK

また、一時テーブルの代わりにテーブル変数を使用する必要がありますか?

カーソルを使ってこれを行うことは可能ですか?

4

2 に答える 2

5

少なくとも私のすべてのテストでは、最も効率的なカーソルは次のようになります。

DECLARE MY_CURSOR CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR ...

現在、カーソルなしでこれを実行できるかどうかを知ることは不可能です。それを伝えるために使用できた唯一の情報を都合よく省略しました。呼び出しごとにプロシージャを呼び出しているようですが、SELECT でそれを行うことはできません。そして、結果でテーブルを更新しますが、テーブルを削除します。

于 2012-06-13T15:13:30.640 に答える
0

したがって、2 つのテーブルがあり、そのうちの 1 つを他の値で更新する必要があり、それらは共通のキーを共有しています。どうぞ:

update [m]
set proc_id = t.proc_id
from #MY_PROCS as [m]
inner join TABLE_PROCS as [t]
   on m.proc_id = t.proc_id
于 2012-06-13T17:34:09.643 に答える