sql >> Base de Datos >  >> RDS >> Sqlserver

Tipos de cursor de SQL Server - Cursor KEYSET | Tutorial de SQL Server / Tutorial de TSQL

Cuando abrimos Keyset Cursor, la membresía y el orden de las filas en el cursor son fijos. KeySet Cursor crea una tabla temporal en TempDB con valores creados de forma única a partir de las columnas que usamos en la instrucción Select.

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.
Es difícil juntar las instantáneas con todos los detalles aquí. Le sugiero que vea el video para ver cómo funcionan las opciones de KEYSET en la realidad.

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?