Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Types de curseur SQL Server - Quelle est la différence entre le curseur LOCAL ET GLOBAL | Tutoriel SQL Server / Tutoriel TSQL

Curseur local :

La portée du curseur local est limitée au lot, à la procédure stockée ou au déclencheur dans lequel il est créé. Une fois le lot, la procédure stockée ou le déclencheur terminé. Le curseur local ne pourra plus être utilisé.

CURSEUR GLOBAL :

La portée de GLOBAL Cursor est limitée à la connexion dans laquelle il est créé. Vous pouvez utiliser GLOBAL CURSOR en plusieurs lots, vous pouvez ouvrir en premier et récupérer les données en second. Vous pouvez également ouvrir le CURSEUR GLOBAL dans une procédure stockée et récupérer les données dans la procédure stockée suivante tant qu'ils utilisent la même connexion.
Si vous n'utilisez pas le mot-clé Local ou Global , le curseur sera créé avec TYPE en utilisant le paramètre de base de données comme indiqué ci-dessous.
Fig 1 :Différence entre le curseur local et le curseur global dans SQL Server
Créons un exemple de table et insérez quelques enregistrements et faites des tests pour prouver notre définition ci-dessus.

--drop table dbo.CustomerCreate table dbo.Customer ( CustomerId Int ,CustomerName VARCHAR(100),StreetAddress VARCHAr(100),City VARCHAR(100),State CHAR(2))go--Insert some Records in Sample TableInsert 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 avec le curseur GLOBAL en plusieurs lots. use TestgoDECLARE Customer_Cursor CURSOR --use LOCAL OR GLOBAL HEREGLOBAL FORSelect CustomerID,CustomerName,StreetAddress,City,Statefrom dbo.CustomerOPEN Customer_Cursor;GO--Terminer le lot et modifier la base de données use TestDBgoFETCH NEXT FROM Customer_CursorWHILE (@@FETCH_STATUS <> -1) BEGIN FETCH NEXT FROM Customer_Cursor ENDCLOSE Customer_Cursor;GODEALLOCATE Customer_Cursor;GONous pourrons voir les enregistrements car nous avons défini Cursor comme GLOBAL et ce sera 
disponible pendant toute la connexion, même si nous avons terminé le premier lot en utilisant GO
instruction.
 Fig 2 :Curseur global dans SQL Server - Test avec le curseur LOCAL dans plusieurs lots. use TestgoDECLARE Customer_Cursor CURSOR --use LOCAL OR GLOBAL HERELOCAL FORSelect CustomerID,CustomerName,StreetAddress,City,Statefrom dbo.CustomerOPEN Customer_Cursor;GO--Terminer le lot et modifier la base de données use TestDBgoFETCH NEXT FROM Customer_CursorWHILE (@@FETCH_STATUS <> -1) BEGIN FETCH NEXT FROM Customer_Cursor ENDCLOSE Customer_Cursor;GODEALLOCATE Customer_Cursor;GO
 
 
Étant donné que la portée du curseur LOCAL est limitée au lot, à la procédure stockée ou au déclencheur, le deuxième lot ne peut pas voir le curseur car nous avons défini le type de curseur LOCAL dans notre requête ci-dessus
Fig 3 :Curseur local dans SQL Server
 

Effectuons maintenant le test avec la procédure stockée et voyons comment le curseur local et le curseur global fonctionnent dans la procédure stockée dans SQL Server.
--Testez avec le curseur LOCAL dans plusieurs lots. 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 FROM Customer <> -1)BEGIN ENDEND--Exécutez les procédures pour obtenir ce que nous obtenons avec GLOBAL et LOCAL Cursor TypeEXEC Dec_Cursor_CustomerGOEXEC Fetch_Cusor_CustomerCLOSE Customer_Cursor;GODEALLOCATE Customer_Cursor;GO
 
 
Si nous exécutons la procédure stockée ci-dessus, nous obtiendrons les résultats tels que nous les avons obtenus dans la figure 2. Comme nous l'avons déclaré en tant que type GLOBAL, nous pourrons l'utiliser dans plusieurs procédures stockées tant que vous les exécutez dans même connexion.

Allez-y et modifiez la procédure stockée et changez le type de GLOBAL à Local, puis exécutez les procédures. Même si nous sommes dans la même connexion, nous obtiendrons l'erreur que nous avons eue dans la figure 3. Comme la portée du curseur est limitée au lot, à la procédure stockée ou au déclencheur une fois que vous avez défini comme LOCAL.
Démo vidéo :pour voir la démonstration détaillée du fonctionnement du curseur local et du curseur global, regardez la vidéo.