sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server-markörtyper - KEYSET-markör | SQL Server Tutorial / TSQL Tutorial

När vi öppnar Keyset Cursor är medlemskapet och ordningen på raderna i markören fast. KeySet Cursor skapar en temptabell i TempDB med unikt byggda värden från kolumnerna som vi använder i Select-satsen.

Här är viktiga punkter att komma ihåg om KEYSET Cursor i SQL Server


  • Om din Select-fråga använder någon tabell utan Unique Index, kommer KEYSET-markören helt enkelt att konverteras till Static Cursor. Se till att alla tabeller du använder i Select Query har ett unikt index. Detta är viktigt eftersom KEYSET Cursor bygger unika identifierare för raderna genom att använda dessa unika värden.
  • Om vi ​​infogar raderna i källtabeller när markören är öppen. Dessa inlägg kommer inte att vara synliga i redan öppnad markör.
  • Om vi ​​uppdaterar nonkey-värdena i bastabellerna kommer dessa ändringar att synas i markören.
  • Om du uppdaterar nyckelkolumnvärdet i bastabell/er medan markören är öppen och sedan försöker hämta värdet. @@FETCH_STATUS ger dig -2. Den uppdatering som gjorts inuti markören till nyckelkolumn med WHERE CURRENT OF-satsen kommer att vara synlig i slutet av markören.
  • Om du tar bort raden från bastabeller medan markören är öppen och sedan försöker hämta den raden i markören, kommer @@FETCH_STATUS att returnera -2.
  • KEYSET-markörer är rullningsbara.
Det är svårt att sätta ihop ögonblicksbilderna med alla detaljer här. Jag skulle föreslå att du tittar på videon för att se hur KEYSET-alternativen fungerar i verkligheten.

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:Vad är KEYSET Cursor i SQL Server och hur KEYSET Cursor fungerar

  1. Liquibase lås - anledningar?

  2. Hur man hämtar poster från idag i MySQL

  3. Parameteriserade frågor med psycopg2 / Python DB-API och PostgreSQL

  4. Hur INTE RLIKE fungerar i MySQL