1

カーソルを使用してテーブルの各行をループし、別のテーブルの行を更新する次の SQL ステートメントがあるとします。

DECLARE @x varchar(100)
DECLARE @y varchar(100)
DECLARE c CURSOR FOR
SELECT col1, col2 FROM table
OPEN c
FETCH NEXT FROM c INTO @x, @y
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE table2 SET cola = @x WHERE colb = @y
FETCH NEXT FROM c INTO @x, @y
END
CLOSE c
DEALLOCATE c;

このステートメントを SQL コンソールまたは Navicat 内で直接実行すると、すべてが期待どおりに機能します。しかし、次を使用してPHPで実行すると:

sqlsrv_query($sql)

table2 の一部の行のみが実際に更新されます。SQL ステートメントのカーソルが正しく実行されていないようです。おそらく、ステートメントのカーソルがまだ実行されている間に sqlsrv_query が返されますか?

結果を返す前に、ステートメントの実行が完全に完了するまで sqlsrv_query に「待機」するように指示する方法はありますか?

4

1 に答える 1

1

カーソルの代わりにこのようなものはどうですか。私がカーソルを作成しなければならなかった唯一の理由は、古いモデルを新しいモデルに変換して、変換のためのビジネス ルールなどを実行するためでした。本番環境でカーソルを実行していません。

update table2
    set cola = t1.col1
from table2 t2
join table1 t1 on t1.col2 = t2.colb
于 2012-11-06T13:56:17.180 に答える