wake-up-neo.com

Was ist die Verwendung eines Cursors in SQL Server?

Ich möchte einen Datenbankcursor verwenden. Zuerst muss ich verstehen, was Verwendung und Syntax sind und in welchem ​​Szenario wir dies in gespeicherten Prozeduren verwenden können? Gibt es unterschiedliche Syntaxen für verschiedene Versionen von SQL Server?

Wann ist es notwendig zu benutzen?

23
Red Swan

Cursor sind ein Mechanismus, um die Zeilen einer Ergebnismenge explizit aufzuzählen, anstatt sie als solche abzurufen.

Sie sind zwar für Programmierer, die While Not RS.EOF Do ... schreiben wollen, komfortabler zu verwenden, sie sollten jedoch in SQL Server-Prozeduren normalerweise vermieden werden, wenn überhaupt möglich - wenn Sie eine Abfrage ohne Cursor schreiben können, geben Sie dies an Der Optimierer bietet eine viel bessere Chance, einen schnellen Weg zur Implementierung zu finden.

Um ehrlich zu sein, habe ich nie einen realistischen Anwendungsfall für einen Cursor gefunden, der nicht vermieden werden konnte, mit Ausnahme einiger administrativer Aufgaben, wie dem Durchlaufen aller Indexe im Katalog und dem Wiederherstellen dieser Indizes. Ich nehme an, dass sie vielleicht einige Zwecke bei der Berichterstellung oder beim Seriendruck haben, aber es ist wahrscheinlich effizienter, die Cursor-ähnliche Arbeit in einer Anwendung auszuführen, die mit der Datenbank kommuniziert, sodass die Datenbank-Engine das tun kann, was sie am besten kann.

34
Jeffrey Hantin

cursor werden verwendet, da in der Unterabfrage Datensatz Datensatz für Zeile abgerufen werden kann. Daher verwenden wir den Cursor zum Abrufen von Datensätzen

Beispiel für einen Cursor:

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

AUSGABE:

ROHIT                           PRG  
jayesh                          PRG
Rocky                           prg
Rocky                           prg
15
rohit vyas

Cursor kann verwendet werden, um Daten Zeile für Zeile abzurufen. Basis.its verhalten sich wie eine Schleifenanweisung (dh while oder for-Schleife) .. Um Cursor in SQL-Prozeduren zu verwenden, müssen Sie Folgendes tun: 1.Declare einen Cursor das definiert eine Ergebnismenge . 2.Öffnen Sie den Cursor, um die Ergebnismenge festzulegen . 3.Ziehen Sie die Daten je nach Bedarf aus dem Cursor in lokale Variablen, Zeile für Zeile . 4.Schließen Sie die Cursor wenn fertig.

zum Beispiel:

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
7
Murugan

Der Cursor selbst ist ein Iterator (wie WHILE). Mit Iterator meine ich eine Möglichkeit, den Datensatz zu durchqueren (dh eine Gruppe ausgewählter Datenzeilen), und Operationen auszuführen, während er durchläuft. Operationen können zum Beispiel INSERT oder DELETE sein. Daher können Sie es zum Beispiel zum Abrufen von Daten verwenden. Der Cursor arbeitet mit den Zeilen der Ergebnismenge der Reihe nach - Zeile für Zeile. Ein Cursor kann als Zeiger auf eine Zeile in einer Reihe von Zeilen angezeigt werden und kann jeweils nur auf eine Zeile verweisen, kann sich jedoch bei Bedarf zu anderen Zeilen der Ergebnismenge bewegen.

Diese link can kann ihre Syntax klar erklären und enthält zusätzliche Informationen sowie Beispiele.

Cursor können auch in Sprocs verwendet werden. Sie sind eine Verknüpfung, mit der Sie eine Abfrage anstelle von mehreren Abfragen verwenden können. Cursor erkennen jedoch den Gültigkeitsbereich und werden außerhalb des Sproc-Bereichs als undefiniert betrachtet, und ihre Operationen werden in einer einzigen Prozedur ausgeführt. Eine gespeicherte Prozedur kann einen Cursor nicht öffnen, abrufen oder schließen, der nicht in der Prozedur deklariert wurde. 

0
ElGrig

In SQL Server wird bei Bedarf ein Cursor verwendet. Anstelle der T-SQL-Befehle, die jeweils für alle Zeilen in der Ergebnismenge ausgeführt werden, verwenden wir einen Cursor, wenn Datensätze in einer Datenbanktabelle in einem Singleton aktualisiert werden müssen Mode, mit anderen Worten Zeile für Zeile, um jeweils eine Zeile oder Zeile für Zeile abzurufen.

Die Arbeit mit Cursorn besteht aus mehreren Schritten:

Deklarieren - Mit Deklarieren wird ein neuer Cursor definiert. Öffnen - Ein Cursor wird geöffnet und gefüllt, indem die vom Cursor definierte SQL-Anweisung ausgeführt wird. Abrufen - Wenn der Cursor geöffnet ist, können Zeilen nacheinander vom Cursor abgerufen werden. Schließen - Nach Datenoperationen sollten wir den Cursor explizit schließen. Freigeben - Schließlich müssen wir die Cursordefinition löschen und alle dem Cursor zugeordneten Systemressourcen freigeben. Syntax

DECLARE Cursorname CURSOR [LOKAL | GLOBAL] [FORWARD_ONLY | SCROLL] [STATIC | SCHLÜSSELANLAGE | DYNAMISCH | FAST_FORWARD] [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] [TYPE_WARNING] FOR select_statement [FOR UPDATE [OF column_name [ ... n]]] [;]

Ich würde argumentieren, dass Sie einen Cursor verwenden möchten, wenn Sie Vergleiche von Merkmalen durchführen möchten, die sich in verschiedenen Zeilen des Rückgabesets befinden, oder wenn Sie in bestimmten Fällen ein anderes Ausgabezeilenformat als ein Standardformat schreiben möchten. Man denke an zwei Beispiele:

  1. Einer befand sich in einem College, wo jedes Add und Drop einer Klasse eine eigene Zeile in der Tabelle hatte. Es war möglicherweise ein schlechtes Design, aber Sie mussten Zeilen vergleichen, um zu wissen, wie viele Zeilen Sie hinzugefügt und gelöscht haben, um festzustellen, ob die Person in der Klasse war oder nicht. Ich kann mir keinen einfachen Weg vorstellen, dies nur mit SQL zu tun. 

  2. Ein anderes Beispiel ist das Schreiben einer Journal-Gesamtzeile für GL -Zeitschriften. Sie erhalten eine beliebige Anzahl von Lastschriften und Gutschriften in Ihrem Journal, Sie haben viele Journale in Ihrer Zeilengruppe und Sie möchten jedes Mal, wenn Sie ein Journal fertigstellen, eine Buchungszeile schreiben, um es in ein Hauptbuch einzugeben. Mit einem Cursor können Sie feststellen, wann Sie ein Journal verlassen haben und ein anderes begonnen haben. Sie haben Akkumulatoren für Ihre Lastschriften und Gutschriften und schreiben eine Journal-Gesamtzeile (oder Tabelleneinfügung), die sich von der Debit-/Kreditzeile unterscheidet.

0
flashgordon