Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Типове курсори на SQL Server - KEYSET Курсор | Урок за SQL Server / Урок за TSQL

Когато отворим Keyset Cursor, членството и редът на редовете в курсора са фиксирани. KeySet Cursor създайте временна таблица в TempDB с уникално изградени стойности от колоните, които използваме в оператора Select.

Ето важни точки, които трябва да запомните за KEYSET Cursor в SQL Server


  • Ако вашата заявка Select използва която и да е таблица без уникален индекс, курсорът KEYSET просто ще бъде преобразуван в статичен курсор. Уверете се, че всички таблици, които използвате в Select Query, имат уникален индекс. Това е важно, тъй като KEYSET Cursor създава уникални идентификатори за редовете, като използва тези уникални стойности.
  • Ако вмъкнем редовете в таблица/и на източника, след като курсорът е отворен. Тези вмъквания няма да се виждат във вече отворен курсор.
  • Ако направим актуализация на неключови стойности в базовите таблици, тези промени ще бъдат видими в курсора.
  • Ако актуализирате стойността на колоната Key в Основна таблица/и, докато курсорът е отворен и след това се опитате да извлечете стойността. @@FETCH_STATUS ще ви върне -2. Актуализираното, направено вътре в курсора до ключова колона с клауза WHERE CURRENT OF, ще бъде видимо в края на курсора.
  • Ако изтриете реда от основна таблица/и, докато курсорът е отворен и след това се опитате да извлечете този ред в курсора, @@FETCH_STATUS ще върне -2.
  • Курсорите на KEYSET могат да се превъртат.
Тук е трудно да се съберат моментните снимки с всички подробности. Предлагам ви да гледате видеоклипа, за да видите как работят опциите на KEYSET в реалността.

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
 


Видео демонстрация:Какво представляват курсорите KEYSET в SQL Server и как работи KEYSET Cursor

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server - намерете n-то срещане в низ

  2. Какво е застой на SQL Server?

  3. Преброяване на DISTINCT в множество колони

  4. Разбиране на ЗАКЛЮЧВАНЕТО на SQL Server при SELECT заявки

  5. Грешка на SQL Server 110:Има по-малко колони в израза INSERT от стойностите, посочени в клаузата VALUES.