Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

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

Wenn wir den Keyset-Cursor öffnen, ist die Zugehörigkeit und Reihenfolge der Zeilen im Cursor festgelegt. Der KeySet-Cursor erstellt eine temporäre Tabelle in TempDB mit eindeutig aufgebauten Werten aus den Spalten, die wir in der Select-Anweisung verwenden.

Hier sind wichtige Punkte, die Sie sich über den KEYSET-Cursor in SQL Server merken sollten


  • Wenn Ihre Auswahlabfrage eine Tabelle ohne eindeutigen Index verwendet, wird der KEYSET-Cursor einfach in einen statischen Cursor umgewandelt. Stellen Sie sicher, dass alle Tabellen, die Sie in Select Query verwenden, einen eindeutigen Index haben. Dies ist wichtig, da der KEYSET-Cursor anhand dieser eindeutigen Werte eindeutige Bezeichner für die Zeilen erstellt.
  • Wenn wir die Zeilen in Quelltabelle(n) einfügen, sobald der Cursor geöffnet ist. Diese Einfügungen sind in einem bereits geöffneten Cursor nicht sichtbar.
  • Wenn wir Nichtschlüsselwerte in den Basistabellen aktualisieren, werden diese Änderungen im Cursor sichtbar.
  • Wenn Sie den Schlüsselspaltenwert in Basistabelle(n) aktualisieren, während der Cursor geöffnet ist, und dann versuchen, den Wert abzurufen. @@FETCH_STATUS gibt Ihnen -2 zurück. Die innerhalb des Cursors vorgenommene Aktualisierung der Schlüsselspalte mit der Klausel WHERE CURRENT OF wird am Ende des Cursors sichtbar sein.
  • Wenn Sie die Zeile aus Basistabelle(n) löschen, während der Cursor geöffnet ist, und dann versuchen, diese Zeile im Cursor abzurufen, gibt @@FETCH_STATUS -2 zurück.
  • KEYSET-Cursor sind scrollbar.
Es ist schwer, die Schnappschüsse mit allen Details hier zusammenzustellen. Ich würde vorschlagen, dass Sie sich das Video ansehen, um zu sehen, wie KEYSET-Optionen in Wirklichkeit funktionieren.

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
 


Video-Demo:Was sind KEYSET-Cursor in SQL Server und wie KEYSET-Cursor funktioniert