Ето важни точки, които трябва да запомните за KEYSET Cursor в SQL Server
- Ако вашата заявка Select използва която и да е таблица без уникален индекс, курсорът KEYSET просто ще бъде преобразуван в статичен курсор. Уверете се, че всички таблици, които използвате в Select Query, имат уникален индекс. Това е важно, тъй като KEYSET Cursor създава уникални идентификатори за редовете, като използва тези уникални стойности.
- Ако вмъкнем редовете в таблица/и на източника, след като курсорът е отворен. Тези вмъквания няма да се виждат във вече отворен курсор.
- Ако направим актуализация на неключови стойности в базовите таблици, тези промени ще бъдат видими в курсора.
- Ако актуализирате стойността на колоната Key в Основна таблица/и, докато курсорът е отворен и след това се опитате да извлечете стойността. @@FETCH_STATUS ще ви върне -2. Актуализираното, направено вътре в курсора до ключова колона с клауза WHERE CURRENT OF, ще бъде видимо в края на курсора.
- Ако изтриете реда от основна таблица/и, докато курсорът е отворен и след това се опитате да извлечете този ред в курсора, @@FETCH_STATUS ще върне -2.
- Курсорите на KEYSET могат да се превъртат.
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
Видео демонстрация:Какво представляват курсорите KEYSET в SQL Server и как работи KEYSET Cursor