36

データベース カーソルを使用したい。まず、その使用法と構文を理解する必要があります。また、ストアド プロシージャでこれを使用できるシナリオはどれですか? SQL Server のバージョンごとに異なる構文はありますか?

いつ使用する必要がありますか?

4

7 に答える 7

47

カーソルは、結果セットを取得するのではなく、結果セットの行を明示的に列挙するメカニズムです。

ただし、 の記述に慣れているプログラマーにとってはより快適に使用できるかもしれませんが、While Not RS.EOF Do ...SQL Server ストアド プロシージャ内では、可能な限り避けるべきものです。カーソルを使用せずにクエリを記述できる場合は、オプティマイザーは、それを実装するための迅速な方法を見つける可能性がはるかに高くなります。

正直なところ、カタログ内のすべてのインデックスをループして再構築するなどのいくつかの管理タスクを除いて、回避できないカーソルの現実的な使用例を見つけたことはありません。レポートの生成やメールのマージで何らかの用途があると思いますが、データベースと対話するアプリケーションでカーソルのような作業を行い、データベース エンジンに最も得意とする操作、つまりセット操作を実行させる方がおそらくより効率的です。

于 2010-11-19T07:15:21.507 に答える
17

カーソルが使用されるのは、サブクエリで行ごとにレコードを取得できるため、カーソルを使用してレコードを取得するためです

カーソルの例:

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
于 2012-12-11T08:32:59.330 に答える
8

カーソルは、行単位でデータを取得するために使用される場合があります。これは、ループ ステートメント (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
于 2012-10-04T06:53:07.317 に答える
1

カーソル自体は反復子です (WHILE など)。イテレータとは、レコード セット (選択されたデータ行のセット) をトラバースし、トラバース中に操作を行う方法を意味します。操作は、たとえば、INSERT または DELETE である可能性があります。したがって、たとえばデータ検索に使用できます。カーソルは、結果セットの行を順番に (行ごとに) 処理します。カーソルは、行セット内の 1 つの行へのポインターと見なすことができ、一度に 1 つの行しか参照できませんが、必要に応じて結果セットの他の行に移動できます。

このリンクには、構文の明確な説明があり、追加情報と例が含まれています。

カーソルは Sprocs でも使用できます。これらは、複数のクエリではなく、1 つのクエリを使用してタスクを実行できるショートカットです。ただし、カーソルはスコープを認識し、sproc のスコープ外では未定義と見なされ、それらの操作は単一のプロシージャ内で実行されます。ストアド プロシージャは、プロシージャで宣言されていないカーソルを開いたり、フェッチしたり、閉じたりすることはできません。

于 2018-07-27T06:14:20.570 に答える