Oto ważne punkty do zapamiętania na temat kursora KEYSET w SQL Server
- Jeśli zapytanie wybierające używa dowolnej tabeli bez indeksu unikatowego, kursor ZESTAWU KLUCZY zostanie po prostu przekonwertowany na Kursor statyczny. Upewnij się, że wszystkie tabele używane w Select Query mają unikalny indeks. Jest to ważne, ponieważ Kursor ZESTAWU KLUCZY tworzy unikalne identyfikatory dla wierszy przy użyciu tych unikalnych wartości.
- Jeśli wstawimy wiersze do tabeli/ek źródłowych, gdy kursor jest otwarty. Te wstawki nie będą widoczne w już otwartym kursorze.
- Jeśli dokonamy aktualizacji wartości niekluczowych w tabelach podstawowych, te zmiany będą widoczne w kursorze.
- Jeśli zaktualizujesz wartość kolumny Klucz w tabeli podstawowej/ach, gdy kursor jest otwarty, a następnie spróbujesz pobrać wartość. @@FETCH_STATUS zwróci Ci -2. Aktualizacja wykonana wewnątrz kursora do kolumny klucza z klauzulą WHERE CURRENT OF będzie widoczna na końcu kursora.
- Jeśli usuniesz wiersz z tabeli bazowej/y, gdy kursor jest otwarty, a następnie spróbujesz pobrać ten wiersz z kursora, @@FETCH_STATUS zwróci -2.
- Kursory KEYSET można przewijać.
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
Prezentacja wideo:co to są kursory KEYSET w programie SQL Server i jak działa kursor KEYSET