Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Tipi di cursore di SQL Server:qual è la differenza tra il cursore LOCALE E GLOBALE | Esercitazione su SQL Server/Esercitazione su TSQL

Cursore locale:

L'ambito di Local Cursor è limitato al batch, alla stored procedure o al trigger in cui viene creato. Una volta completato il batch, la procedura memorizzata o il trigger. Il cursore locale non sarà più disponibile per l'uso.

CURSORE GLOBALE:

L'ambito di GLOBAL Cursor è limitato alla connessione in cui viene creato. Puoi usare GLOBAL CURSOR in più batch, puoi aprire in primo e recuperare i dati in secondo. Puoi anche aprire il GLOBAL CURSOR in una Stored Procedure e recuperare i dati nella Next Stored Procedure purché utilizzino la stessa connessione.
Se non vuoi utilizzare la parola chiave Local o Global , il Cursor verrà creato con TIPO utilizzando l'impostazione del database come mostrato di seguito.
Fig 1:differenza tra cursore locale e cursore globale in SQL Server
Creiamo una tabella di esempio e inserire alcuni record ed eseguire alcuni test per dimostrare la nostra definizione di cui sopra.

--drop table dbo.CustomerCreate table dbo.Customer ( CustomerId Int ,CustomerName VARCHAR(100),StreetAddress VARCHAr(100),Città VARCHAR(100),Stato CHAR(2))go--Inserisci alcuni record nella tabella di esempioInserisci in 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 con il cursore GLOBAL in lotti multipli. use TestgoDECLARE Customer_Cursor CURSOR --use LOCAL OR GLOBAL HEREGLOBAL FORSelect CustomerID,CustomerName,StreetAddress,City,Statoda dbo.CustomerOPEN Customer_Cursor;GO--Termina il batch e modifica il database use TestDBgoFETCH NEXT FROM Customer_CursorWHILE (@@FETCH_STATUS <> -1) BEGIN FETCH NEXT FROM Customer_Cursor ENDCLOSE Customer_Cursor;GODEALLOCATE Customer_Cursor;GOSaremo in grado di vedere i record poiché abbiamo definito Cursor come GLOBAL e sarà 
disponibile durante l'intera connessione, anche se abbiamo terminato il primo Batch utilizzando GO
dichiarazione.
Fig 2:Cursore globale in SQL Server:test con il cursore LOCAL in batch multipli. use TestgoDECLARE Customer_Cursor CURSOR --use LOCAL OR GLOBAL HERELOCAL FORSelect CustomerID,CustomerName,StreetAddress,City,Statoda dbo.CustomerOPEN Customer_Cursor;GO--Termina il batch e modifica il database use TestDBgoFETCH NEXT FROM Customer_CursorWHILE (@@FETCH_STATUS <> -1) BEGIN FETCH NEXT FROM Customer_Cursor ENDCLOSE Customer_Cursor;GODEALLOCATE Customer_Cursor;GO
 
 
Poiché l'ambito di LOCAL Cursor è limitato a Batch, Stored Procedure o Trigger, il secondo batch non è in grado di vedere il cursore poiché abbiamo definito il tipo di cursore LOCAL nella nostra query precedente
Fig 3:cursore locale in SQL Server
 

Eseguiamo ora il test con Stored procedure e vediamo come funzionano il cursore locale e il cursore globale in Stored procedure in SQL Server.
--Test con il cursore LOCAL in batch multipli. use TestgoCreate Procedure Dec_Cursor_Customer ASBEGINDECLARE Customer_Cursor CURSOR --use LOCAL OR GLOBAL HEREGLOBAL FORSeleziona CustomerID,CustomerName,StreetAddress,City,Statofrom dbo.CustomerOPEN Customer_Cursor;ENDGOCreate Procedure Fetch_Cusor_CustomerAS BEGINFETCH NEXT FROM Customer_CursorWHILE (@@FETCH_STATUS <> -1)BEGIN FETCH NEXTor FROM FINE--Esegui le procedure per ciò che otteniamo con GLOBAL e LOCAL Tipo di cursoreEXEC Dec_Cursor_CustomerGOEXEC Fetch_Cusor_CustomerCLOSE Customer_Cursor;GODEALLOCATE Customer_Cursor;GO
 
 
Se eseguiamo la procedura memorizzata di cui sopra, otterremo i risultati ottenuti in Fig 2. Poiché abbiamo dichiarato come tipo GLOBAL, saremo in grado di utilizzarlo in più stored procedure purché vengano eseguite in stessa connessione.

Vai avanti e modifica la procedura memorizzata e cambia il tipo da GLOBAL a Locale, quindi esegui le procedure. Anche se siamo nella stessa connessione, otterremo l'errore che abbiamo ottenuto in Fig 3. Poiché l'ambito di Cursor è limitato a Batch, Stored Procedure o Trigger una volta definito come LOCAL.
Video Demo:per vedere la demo dettagliata su come funzionano Local Cursor e Global Cursor, guarda il video.