Her er vigtige punkter at huske om KEYSET Cursor i SQL Server
- Hvis din Select-forespørgsel bruger en tabel uden Unique Index, vil KEYSET-markøren simpelthen blive konverteret til Static Cursor. Sørg for, at alle de tabeller, du bruger i Select Query, har et unikt indeks. Dette er vigtigt, da KEYSET Cursor bygger unikke identifikatorer til rækkerne ved at bruge disse unikke værdier.
- Hvis vi indsætter rækkerne i kildetabeller, når markøren er åben. Disse indsættelser vil ikke være synlige i den allerede åbnede markør.
- Hvis vi opdaterer til nonkey-værdier i basistabellerne, vil disse ændringer være synlige i markøren.
- Hvis du opdaterer nøglekolonnens værdi i basistabeller, mens markøren er åben, og derefter prøver at hente værdien. @@FETCH_STATUS vil returnere dig -2. Den opdatering, der er lavet inde i cursoren til Key Column med WHERE CURRENT OF-klausulen, vil være synlig i slutningen af Cursor.
- Hvis du sletter rækken fra basistabellerne, mens markøren er åben, og derefter prøver at hente den pågældende række i markøren, vil @@FETCH_STATUS returnere -2.
- KEYSET-markører kan rulles.
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:Hvad er KEYSET Cursorer i SQL Server, og hvordan KEYSET Cursor virker