Voici des points importants à retenir sur KEYSET Cursor dans SQL Server
- Si votre requête Select utilise une table sans index unique, le curseur KEYSET va simplement être converti en curseur statique. Assurez-vous que toutes les tables que vous utilisez dans Select Query ont un index unique. Ceci est important car KEYSET Cursor crée des identifiants uniques pour les lignes en utilisant ces valeurs uniques.
- Si nous insérons les lignes dans la/les table(s) source(s) une fois le curseur ouvert. Ces insertions ne seront pas visibles dans le curseur déjà ouvert.
- Si nous mettons à jour les valeurs non clés dans les tables de base, ces modifications seront visibles dans le curseur.
- Si vous mettez à jour la valeur de la colonne Clé dans la ou les tables de base alors que le curseur est ouvert, puis essayez de récupérer la valeur. @@FETCH_STATUS vous renverra -2. La mise à jour effectuée à l'intérieur du curseur vers la colonne clé avec la clause WHERE CURRENT OF sera visible à la fin du curseur.
- Si vous supprimez la ligne de la ou des tables de base alors que le curseur est ouvert, puis essayez de récupérer cette ligne dans le curseur, @@FETCH_STATUS renverra -2.
- Les curseurs KEYSET peuvent défiler.
Créer la table dbo.Customer ( CustomerId Int ,CustomerName VARCHAR(100),StreetAddress VARCHAr(100),City VARCHAR (100),State CHAR(2))go--Create Unique Index on CustomerIDCREATE UNIQUE INDEX UQ_CustomerID ON dbo.Customer (CustomerID); --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 '--Insert NEW RecordInsert into dbo.CustomerSelect 5,'Robert Ladson','Pathway Street Address','High Point','NC'--Delete RecordsDelete from dbo.CustomerWhere CustomerID in (3,4)--Update All Enregistrement pour NONKEY ColumnUpdate dbo.Customerset CustomerName='NO NAME'--Update Key Column valueUpdate dbo.customerset CustomerID=9where Customerid=3--KEYSET CURSOR ScriptDeclare @CustomerID INTDeclare @CustomerNAme VARCHAR (100)DECLARE @StreetAddress VARCHAR(100)DECLARE @City VARCHAR(100)DECLARE @State CHAR(2)--DECLARE A CURSORDECLARE CUR CURSORKEYSETFORSelect CustomerID,CustomerName,StreetAddress,City,State from dbo.Customer--OPEN CURSOROPEN CURPrint 'CURSOR IS OPEN'--FET CH NEXT RECORDFETCH NEXT FROM CUR INTO @CustomerID,@CustomerNAme,@StreetAddress,@City,@StateWHILE @@FETCH_STATUS=0BEGIN RAISERROR ('',0,1) WITH NOWAITWAITFOR DELAY '00:00:15'--Vous pouvez utiliser Fonction CONCAT dans SQL 2012 ET Dernières pour Contatenation d'entiers et de chaînes - PRINT CONCAT(@CustomerID,' ',@CustomerNAme,' ',@StreetAddress,' ',@City,' ',@State) Print CAST(@CustomerID AS VARCHAR(10))+' '+@CustomerNAme+' '+@StreetAddress+' '+@City+' '+@State FETCH NEXT FROM CUR INTO @CustomerID,@CustomerNAme,@StreetAddress,@City,@StatePrint @@FETCH_STATUSENDCLOSE CURDEALLOCATE CUR
Démonstration vidéo :Que sont les curseurs KEYSET dans SQL Server et comment fonctionne le curseur KEYSET