質問: カーソルは本当に「正しい」選択ですか? 時には、データを処理するときに手続き型プログラミングが絶対に避けられない場合もあります。 私は現在、いくつかのレガシーコードの最適化に取り組んでいます。それはカーソル、 `IF` / `ELSE` ステートメントと `BEGIN` / `END` カーソルをリバースエンジニアリングして手続きプロセスにすることを望んでいました。今私はアルゴリズムの解読の最後にあり、実現しています。 。 。 ooops ...レコードについた各選択は、前のすべてのレコードのプロセスの結果に依存するため、プロシージャであることが*持っています*。 だから私は破れている... SQL Serverの処理(CLRのSP、UDFのなど)でプロシージャコードを混合するための他の選択肢があります。私は仕事のための適切なツールを使用することを大いに信じているので、私はこれのために.NET CLR SPを作ることに傾いています。しかし、カーソルを単純化するだけで、カーソルを*保持*することは、より速く簡単に行えます。 あなたはどう思いますか? SQL Serverを使用して.NETモジュールにアクセスできるようになったので、カーソルを使用することはもう適切ではありませんか?
回答: SQLサーバーでは、少なくともグローバル一時表と表変数の両方を持つWHOWでは、サーバー側のカーソルを使用するシナリオを想像することはできません。従来のアプリで発見したように、すべてのコードを設定ベースにすることはできませんが、手続き的にレコードを反復処理する必要がある場合でも、カーソルは最悪の選択肢です。 例えばテーブル変数を使用して、 (そして、このアプローチは非常に大きなテーブルセットのパフォーマンスが低下し始めます) ``` Declare @Pks Table (pk integer primary key not null) Insert @pks(pk) Select pkcolName from table where ... [here put logic to extract id values for rows you need to iterate over -- then put procedural code here ... Declare @pk Integer While Exists (Select * From @pks) Begin Select @pk = Max(pk) From @pks -- assuming you need to work -- on pk values from highest to lowest //Here do work on one record at a time, using value in @pk Delete @pks Where pk = @pk End ```