Hier zijn belangrijke punten om te onthouden over KEYSET Cursor in SQL Server
- Als uw Select-query een tabel zonder unieke index gebruikt, wordt de KEYSET-cursor gewoon geconverteerd naar een statische cursor. Zorg ervoor dat alle tabellen die u gebruikt in Select Query een unieke index hebben. Dit is belangrijk omdat de KEYSET-cursor unieke identifiers voor de rijen bouwt met behulp van deze unieke waarden.
- Als we de rijen in de brontabel(len) invoegen zodra de cursor open is. Die invoegingen zijn niet zichtbaar in de reeds geopende cursor.
- Als we de niet-sleutelwaarden in de basistabellen bijwerken, zullen die wijzigingen zichtbaar zijn in de cursor.
- Als u de sleutelkolomwaarde in de basistabel/s bijwerkt terwijl de cursor is geopend en vervolgens probeert de waarde op te halen. @@FETCH_STATUS zal u -2 teruggeven. De bijgewerkte gemaakt binnen de cursor naar Key Column met WHERE CURRENT OF-component zal zichtbaar zijn aan het einde van Cursor.
- Als u de rij uit de basistabel/s verwijdert terwijl de cursor open is en vervolgens probeert die rij in de cursor op te halen, zal @@FETCH_STATUS -2 retourneren.
- KEYSET-cursors kunnen worden geschoven.
Create table dbo.Customer ( CustomerId Int , CustomerName VARCHAR(100), StreetAddress VARCHAr(100), City VARCHAR(100), State CHAR(2)) go --Create Unique Index on CustomerID CREATE UNIQUE INDEX UQ_CustomerID ON dbo.Customer (CustomerID); --Insert few Records in Sample Table Insert into dbo.Customer Select 1,'Aamir shahzad','Test Street Address','Charlotte','NC' Union all Select 2,'M Raza','Test Street Address','Charlotte','NC' union all Select 3,'John Smith','Test Street Address','New York City','NY' union All Select 4,'Christy Richard','Test Street Address','Rio Rancho','NM' --Insert NEW Record Insert into dbo.Customer Select 5,'Robert Ladson','Pathway Street Address','High Point','NC' --Delete Records Delete from dbo.Customer Where CustomerID in (3,4) --Update All Record for NONKEY Column Update dbo.Customer set CustomerName='NO NAME' --Update Key Column value Update dbo.customer set CustomerID=9 where Customerid=3 --KEYSET CURSOR Script Declare @CustomerID INT Declare @CustomerNAme VARCHAR (100) DECLARE @StreetAddress VARCHAR(100) DECLARE @City VARCHAR(100) DECLARE @State CHAR(2) --DECLARE A CURSOR DECLARE CUR CURSOR KEYSET FOR Select CustomerID,CustomerName,StreetAddress,City,State from dbo.Customer --OPEN CURSOR OPEN CUR Print 'CURSOR IS OPEN' --FETCH NEXT RECORD FETCH NEXT FROM CUR INTO @CustomerID,@CustomerNAme,@StreetAddress,@City,@State WHILE @@FETCH_STATUS=0 BEGIN RAISERROR ('',0,1) WITH NOWAIT WAITFOR DELAY '00:00:15' --You can use CONCAT Function in SQL 2012 AND Latest for Contatenation of Integters and Strings --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,@State Print @@FETCH_STATUS END CLOSE CUR DEALLOCATE CUR
Videodemo:wat zijn KEYSET-cursors in SQL Server en hoe werkt de KEYSET-cursor