Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Cursortypen – Was ist der Unterschied zwischen LOKALEN UND GLOBAL-Cursorn | SQL Server-Tutorial / TSQL-Tutorial

Lokaler Cursor:

Der Geltungsbereich des lokalen Cursors ist auf den Stapel, die gespeicherte Prozedur oder den Trigger beschränkt, in dem er erstellt wird. Sobald der Stapel, die gespeicherte Prozedur oder der Trigger abgeschlossen ist. Der lokale Cursor steht nicht mehr zur Verfügung.

GLOBALER CURSOR:

Der Geltungsbereich von GLOBAL Cursor ist auf die Verbindung beschränkt, in der er erstellt wird. Sie können GLOBAL CURSOR in mehreren Stapeln verwenden, Sie können zuerst öffnen und die Daten im zweiten abrufen. Sie können den GLOBAL CURSOR auch in einer gespeicherten Prozedur öffnen und die Daten in der nächsten gespeicherten Prozedur abrufen, solange sie dieselbe Verbindung verwenden.
Wenn Sie die Schlüsselwörter Local oder Global nicht verwenden würden, wird der Cursor mit erstellt TYPE, indem Sie die Datenbankeinstellung wie unten gezeigt verwenden.
Abb. 1:Unterschied zwischen lokalem Cursor und globalem Cursor in SQL Server
Erstellen wir eine Beispieltabelle und fügen Sie einige Datensätze ein und führen Sie einige Tests durch, um unsere obige Definition zu beweisen VARCHAr(100),City VARCHAR(100),State CHAR(2))go--Einige Datensätze in Beispieltabelle einfügenInsert into dbo.CustomerSelect 1,'Aamir shahzad','Test Street Address','Charlotte','NC' Union allSelect 2,'M Raza','Test Street Address','Charlotte','NC'union allSelect 3,'John Smith','Test Street Address','New York City','NY'union AllSelect 4, 'Christy Richard', 'Test Street Address', 'Rio Rancho', 'NM' – Test mit GLOBAL Cursor in mehreren Stapeln. use TestgoDECLARE Customer_Cursor CURSOR --use LOCAL OR GLOBAL HEREGLOBAL FORSelect CustomerID,CustomerName,StreetAddress,City,Statefrom dbo.CustomerOPEN Customer_Cursor;GO--Beenden Sie den Stapel und ändern Sie die Datenbank use TestDBgoFETCH NEXT FROM Customer_CursorWHILE (@@FETCH_STATUS <> -1) BEGIN FETCH NEXT FROM Customer_Cursor ENDCLOSE Customer_Cursor;GODEALLOCATE Customer_Cursor;GOWir können die Datensätze sehen, da wir den Cursor als GLOBAL definiert haben und es wird sein
während der gesamten Verbindung verfügbar, auch wenn wir den ersten Batch mit GO beendet haben
Anweisung.
Abb. 2:Globaler Cursor in SQL Server – Test mit LOCAL-Cursor in mehreren Batches. use TestgoDECLARE Customer_Cursor CURSOR --use LOCAL OR GLOBAL HERELOCAL FORSelect CustomerID,CustomerName,StreetAddress,City,Statefrom dbo.CustomerOPEN Customer_Cursor;GO--Beenden Sie den Stapel und ändern Sie die Datenbank use TestDBgoFETCH NEXT FROM Customer_CursorWHILE (@@FETCH_STATUS <> -1) BEGIN FETCH NEXT FROM Customer_Cursor ENDCLOSE Customer_Cursor;GODEALLOCATE Customer_Cursor;GO
 
 
Da der Geltungsbereich für den LOCAL-Cursor auf Batch, Stored Procedure oder Trigger beschränkt ist, kann der zweite Batch den Cursor nicht sehen, da wir den LOCAL-Cursor-Typ in unserer obigen Abfrage definiert haben
Abb. 3:Lokaler Cursor in SQL Server
 

Lassen Sie uns nun den Test mit Stored Procedure durchführen und sehen, wie Local Cursor und Global Cursor in Stored Procedures in SQL Server funktionieren.
--Testen Sie mit LOCAL Cursor in mehreren Batches. use TestgoCreate Procedure Dec_Cursor_Customer ASBEGINDECLARE Customer_Cursor CURSOR --use LOCAL OR GLOBAL HEREGLOBAL FORSelect CustomerID,CustomerName,StreetAddress,City,Statefrom dbo.CustomerOPEN Customer_Cursor;ENDGOCreate Procedure Fetch_Cusor_CustomerAS BEGINFETCH NEXT FROM Customer_CursorWHILE (@@FETCH_STATUS) ENDEND – Führen Sie die Prozeduren aus, was wir mit GLOBAL und LOCAL erhalten. Cursor TypeEXEC Dec_Cursor_CustomerGOEXEC Fetch_Cusor_CustomerCLOSE Customer_Cursor;GODEALLOCATE Customer_Cursor;GO
 
 
Wenn wir die obige gespeicherte Prozedur ausführen, erhalten wir die Ergebnisse wie in Abb. 2. Da wir als GLOBAL-Typ deklariert haben, können wir sie in mehreren gespeicherten Prozeduren verwenden, solange Sie sie ausführen gleiche Verbindung.

Fahren Sie fort und ändern Sie die gespeicherte Prozedur und ändern Sie den Typ von GLOBAL zu Local und führen Sie dann die Prozeduren aus. Auch wenn wir uns in derselben Verbindung befinden, erhalten wir den Fehler, den wir in Abb. 3 erhalten haben. Da der Bereich des Cursors auf Batch, Stored Procedure oder Trigger beschränkt ist, sobald Sie ihn als LOCAL definieren.
Video-Demo:Sehen Sie sich das Video an, um eine detaillierte Demo zur Funktionsweise des lokalen Cursors und des globalen Cursors zu sehen.