sql >> Database >  >> RDS >> Sqlserver

Typen SQL Server-cursor - KEYSET-cursor | SQL Server-zelfstudie / TSQL-zelfstudie

Wanneer we Keyset Cursor openen, staat het lidmaatschap en de volgorde van rijen in de cursor vast. KeySet Cursor maakt een tijdelijke tabel in TempDB met uniek gebouwde waarden uit de kolommen die we gebruiken in Select-statement.

Hier zijn belangrijke punten om te onthouden over KEYSET Cursor in SQL Server


  • Als uw Select-query een tabel zonder unieke index gebruikt, wordt de KEYSET-cursor gewoon geconverteerd naar een statische cursor. Zorg ervoor dat alle tabellen die u gebruikt in Select Query een unieke index hebben. Dit is belangrijk omdat de KEYSET-cursor unieke identifiers voor de rijen bouwt met behulp van deze unieke waarden.
  • Als we de rijen in de brontabel(len) invoegen zodra de cursor open is. Die invoegingen zijn niet zichtbaar in de reeds geopende cursor.
  • Als we de niet-sleutelwaarden in de basistabellen bijwerken, zullen die wijzigingen zichtbaar zijn in de cursor.
  • Als u de sleutelkolomwaarde in de basistabel/s bijwerkt terwijl de cursor is geopend en vervolgens probeert de waarde op te halen. @@FETCH_STATUS zal u -2 teruggeven. De bijgewerkte gemaakt binnen de cursor naar Key Column met WHERE CURRENT OF-component zal zichtbaar zijn aan het einde van Cursor.
  • Als u de rij uit de basistabel/s verwijdert terwijl de cursor open is en vervolgens probeert die rij in de cursor op te halen, zal @@FETCH_STATUS -2 retourneren.
  • KEYSET-cursors kunnen worden geschoven.
Het is moeilijk om de snapshots hier samen te voegen met alle details. Ik raad u aan de video te bekijken om te zien hoe de KEYSET-opties in het echt werken.

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:wat zijn KEYSET-cursors in SQL Server en hoe werkt de KEYSET-cursor

  1. Benchmarking van beheerde PostgreSQL-cloudoplossingen - deel vier:Microsoft Azure

  2. SIN() Voorbeelden in SQL Server

  3. Hoe Zabbix op Ubuntu 20.04 te installeren en configureren?

  4. Slaapstand UUID met PostgreSQL en SQL Server