データベース カーソルを使用したい。まず、その使用法と構文を理解する必要があります。また、ストアド プロシージャでこれを使用できるシナリオはどれですか? SQL Server のバージョンごとに異なる構文はありますか?
いつ使用する必要がありますか?
データベース カーソルを使用したい。まず、その使用法と構文を理解する必要があります。また、ストアド プロシージャでこれを使用できるシナリオはどれですか? SQL Server のバージョンごとに異なる構文はありますか?
いつ使用する必要がありますか?
カーソルは、結果セットを取得するのではなく、結果セットの行を明示的に列挙するメカニズムです。
ただし、 の記述に慣れているプログラマーにとってはより快適に使用できるかもしれませんが、While Not RS.EOF Do ...
SQL Server ストアド プロシージャ内では、可能な限り避けるべきものです。カーソルを使用せずにクエリを記述できる場合は、オプティマイザーは、それを実装するための迅速な方法を見つける可能性がはるかに高くなります。
正直なところ、カタログ内のすべてのインデックスをループして再構築するなどのいくつかの管理タスクを除いて、回避できないカーソルの現実的な使用例を見つけたことはありません。レポートの生成やメールのマージで何らかの用途があると思いますが、データベースと対話するアプリケーションでカーソルのような作業を行い、データベース エンジンに最も得意とする操作、つまりセット操作を実行させる方がおそらくより効率的です。
カーソルが使用されるのは、サブクエリで行ごとにレコードを取得できるため、カーソルを使用してレコードを取得するためです
カーソルの例:
DECLARE @eName varchar(50), @job varchar(50)
DECLARE MynewCursor CURSOR -- Declare cursor name
FOR
Select eName, job FROM emp where deptno =10
OPEN MynewCursor -- open the cursor
FETCH NEXT FROM MynewCursor
INTO @eName, @job
PRINT @eName + ' ' + @job -- print the name
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM MynewCursor
INTO @ename, @job
PRINT @eName +' ' + @job -- print the name
END
CLOSE MynewCursor
DEALLOCATE MynewCursor
出力:
ROHIT PRG
jayesh PRG
Rocky prg
Rocky prg
カーソルは、行単位でデータを取得するために使用される場合があります。これは、ループ ステートメント (while または for ループ) のように機能します。SQL プロシージャーでカーソルを使用するには、以下を行う必要があります。 1. 結果セットを定義するカーソルを宣言します。2.カーソルを開いて結果セットを確立します。3. 必要に応じて、カーソルから一度に 1 行ずつデータをローカル変数にフェッチします。4.完了したらカーソルを閉じます。
例:
declare @tab table
(
Game varchar(15),
Rollno varchar(15)
)
insert into @tab values('Cricket','R11')
insert into @tab values('VollyBall','R12')
declare @game varchar(20)
declare @Rollno varchar(20)
declare cur2 cursor for select game,rollno from @tab
open cur2
fetch next from cur2 into @game,@rollno
WHILE @@FETCH_STATUS = 0
begin
print @game
print @rollno
FETCH NEXT FROM cur2 into @game,@rollno
end
close cur2
deallocate cur2
カーソル自体は反復子です (WHILE など)。イテレータとは、レコード セット (選択されたデータ行のセット) をトラバースし、トラバース中に操作を行う方法を意味します。操作は、たとえば、INSERT または DELETE である可能性があります。したがって、たとえばデータ検索に使用できます。カーソルは、結果セットの行を順番に (行ごとに) 処理します。カーソルは、行セット内の 1 つの行へのポインターと見なすことができ、一度に 1 つの行しか参照できませんが、必要に応じて結果セットの他の行に移動できます。
このリンクには、構文の明確な説明があり、追加情報と例が含まれています。
カーソルは Sprocs でも使用できます。これらは、複数のクエリではなく、1 つのクエリを使用してタスクを実行できるショートカットです。ただし、カーソルはスコープを認識し、sproc のスコープ外では未定義と見なされ、それらの操作は単一のプロシージャ内で実行されます。ストアド プロシージャは、プロシージャで宣言されていないカーソルを開いたり、フェッチしたり、閉じたりすることはできません。