Aquí hay puntos importantes para recordar sobre KEYSET Cursor en SQL Server
- Si su consulta de selección utiliza cualquier tabla sin índice único, el cursor KEYSET simplemente se convertirá en un cursor estático. Asegúrese de que todas las tablas que está utilizando en Select Query tengan un índice único. Esto es importante ya que KEYSET Cursor crea identificadores únicos para las filas utilizando estos valores únicos.
- Si insertamos las filas en la(s) tabla(s) de origen una vez que el cursor está abierto. Esas inserciones no serán visibles en el cursor ya abierto.
- Si actualizamos valores no clave en las tablas base, esos cambios serán visibles en el cursor.
- Si actualiza el valor de la columna Clave en la(s) tabla(s) base(s) mientras el cursor está abierto y luego intenta recuperar el valor. @@FETCH_STATUS le devolverá -2. La actualización realizada dentro del cursor a la columna clave con la cláusula WHERE CURRENT OF será visible al final del cursor.
- Si elimina la fila de la(s) tabla(s) base(s) mientras el cursor está abierto y luego intenta buscar esa fila en el cursor, @@FETCH_STATUS devolverá -2.
- Los cursores KEYSET se pueden desplazar.
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
Demostración en video:¿Qué son los cursores KEYSET en SQL Server y cómo funciona el cursor KEYSET?