sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server Cursor Types - KEYSET Cursor | SQL Server Tutorial / TSQL Tutorial

Når vi åbner Keyset Cursor, er medlemskabet og rækkefølgen af ​​rækker i markøren fast. KeySet Cursor laver en temp-tabel i TempDB med unikt opbyggede værdier fra de kolonner, som vi bruger i Select-sætning.

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.
Det er svært at sætte øjebliksbillederne sammen med alle detaljerne her. Jeg vil foreslå, at du ser videoen for at se, hvordan KEYSET-indstillinger fungerer i virkeligheden.

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

  1. Postgresql generere_serie af måneder

  2. Korrekt måde at give brugere adgang til yderligere skemaer i Oracle

  3. Hvornår er det tid til at opgradere til SQL?

  4. Søg efter "hele ord match" med SQL Server LIKE-mønster