web-dev-qa-db-ja.com

カーソルを使用して更新

カーソルの代わりにさまざまなクエリでテーブルを更新できることはわかっていますが、カーソルについての知識を得るためにカーソルを使用してみたかったのです。これが私が試していたもので、nullの代わりにnull値を持つ新しい列を挿入しました。ここでクエリを使用したタイトル列に基づいてその列を更新したかったのですが、テーブルを更新できません。誰かがこれに対する解決策を提案できます。

Declare @Title varchar(max)
Declare @Department varchar(max)

Declare Department_Cursor Cursor 
For 
    Select Title, Department 
    from Sample_table 

Open Department_Cursor
Fetch Next From Department_Cursor Into @Title, @Department

While @@fetch_status = 0
Begin
     Update sample_table
     Set @Department = 'Production' 
     where @Title = '%Production%'

     Fetch Next From Department_Cursor Into @Title, @Department
End

Close Department_Cursor 
Deallocate Department_Cursor
1
jason

私はあなたが持っているものを実行しようとしましたが、1つの小さなエラーに気づきました:

where @Title = '%Production%'

したがって、@ Titleが実際に= '%Production%'の場合、テーブル全体が更新されます。それまでは、0行を更新します。私の推測では、あなたがやろうとしていることは次のようなものです。

WHERE @Title LIKE '%Production%'
  AND Title = @Title

そして、さらに詳しく調べてみると、これも必要ないと思います

SET @Department = 'Production' 

あなたはおそらく意味します

SET Department = 'Production'

これは、カーソルでDepartmentを引く必要がまったくないことも意味します。最後になりましたが、カーソルがプルされているテーブルを更新しているので、読み取り専用カーソルを使用します。ただし、これはカーソルの結果をtempdbに書き込むため、テーブルが大きい場合はあまりお勧めできません。

最後のコメント:カーソルは必ずしも悪いわけではありません。ただし、バッチ処理が不可能な場合にのみ使用してください。複数の入力を使用してストアドプロシージャを実行するとします。しかし、あなたが積極的にそれらを実践しているのは素晴らしいことだと思います。

1
Kenneth Fisher