1

以下を検討してください (準疑似コード):

CREATE TABLE foobar (
    id INT NOT NULL
    message VARCHAR(40) NOT NULL
)

INSERT INTO foobar (1, "hello");
INSERT INTO foobar (2, "world");


my $resultset = "SELECT * FROM foobar";
while(!$resultset->EOF) {
    "UPDATE foobar SET message='blah' WHERE id = ".$resultset->id;
    $resultset->moveNext;
}

本質的に、私はテーブルからすべてのレコードを選択しようとしており、いくつかのフィールドを更新するそれぞれをループしています。ただし、これを行うと、次のエラーが発生します。

[Microsoft][SQL Server Native Client 10.0][SQL Server]別の未処理の結果セットがアクティブである間に、トリガーが結果セットを返したか、SET NOCOUNT OFF で実行されていました。(SQL-42000) continuous.pl 行 493。

問題は、トリガーを実行していないことです。これは、アクティブな結果セットを更新しようとしていることが原因ではないかと考えたので、すべてのデータを一時テーブルに選択し、一時テーブルを反復処理して元のテーブルを更新するという中間ステップを追加しましたが、それでも取得します同じエラー。

何が起こっているのですか?

4

1 に答える 1

1

さて私は愚かだと感じます。テーブルにトリガーがあり、DIDのnocountがonに設定されていますが、トリガーにnocountを設定する直前に、まれな状況でのみ実行される1行のコードがあり、たまたまこれを実行しました。時間。トリガーを修正すると、問題が修正されました。もっとコーヒーが必要です。

単一の更新ステートメントではなくループでこれを行う理由は、実際のクエリが非常に複雑であり(適切にフォーマットされ、約100行)、更新されるデータが更新される行のデータに部分的に依存しているためです。 、およびデータベース内の他のテーブル。確かに、私はおそらく巧妙な結合のセットを使用できますが、これは非常に複雑で、後で最適化することを好む状況の1つです。

于 2013-01-09T16:00:26.967 に答える