Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Typy kursorów programu SQL Server — Kursor ZESTAWU KLUCZY | Samouczek SQL Server / Samouczek TSQL

Kiedy otwieramy Keyset Cursor, członkostwo i kolejność wierszy w kursorze są stałe. KeySet Cursor tworzy tabelę tymczasową w TempDB z unikalnie zbudowanymi wartościami z kolumn, których używamy w instrukcji Select.

Oto ważne punkty do zapamiętania na temat kursora KEYSET w SQL Server


  • Jeśli zapytanie wybierające używa dowolnej tabeli bez indeksu unikatowego, kursor ZESTAWU KLUCZY zostanie po prostu przekonwertowany na Kursor statyczny. Upewnij się, że wszystkie tabele używane w Select Query mają unikalny indeks. Jest to ważne, ponieważ Kursor ZESTAWU KLUCZY tworzy unikalne identyfikatory dla wierszy przy użyciu tych unikalnych wartości.
  • Jeśli wstawimy wiersze do tabeli/ek źródłowych, gdy kursor jest otwarty. Te wstawki nie będą widoczne w już otwartym kursorze.
  • Jeśli dokonamy aktualizacji wartości niekluczowych w tabelach podstawowych, te zmiany będą widoczne w kursorze.
  • Jeśli zaktualizujesz wartość kolumny Klucz w tabeli podstawowej/ach, gdy kursor jest otwarty, a następnie spróbujesz pobrać wartość. @@FETCH_STATUS zwróci Ci -2. Aktualizacja wykonana wewnątrz kursora do kolumny klucza z klauzulą ​​WHERE CURRENT OF będzie widoczna na końcu kursora.
  • Jeśli usuniesz wiersz z tabeli bazowej/y, gdy kursor jest otwarty, a następnie spróbujesz pobrać ten wiersz z kursora, @@FETCH_STATUS zwróci -2.
  • Kursory KEYSET można przewijać.
Trudno tutaj zestawić migawki ze wszystkimi szczegółami. Proponuję obejrzeć film, aby zobaczyć, jak opcje KEYSET działają w rzeczywistości.

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
 


Prezentacja wideo:co to są kursory KEYSET w programie SQL Server i jak działa kursor KEYSET

  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 — dynamiczna tabela przestawna — wstrzyknięcie SQL

  2. Co to jest „rowversion” w SQL Server?

  3. Utwórz kolumnę „Ostatnia modyfikacja” w SQL Server

  4. Jakie są przypadki użycia wyboru CHAR nad VARCHAR w SQL?

  5. Wersjonowanie bazy danych SQL Server