sql >> Databáze >  >> RDS >> Sqlserver

Typy kurzoru SQL Server - Kurzor KEYSET | Kurz SQL Server / Kurz TSQL

Když otevřeme Keyset Cursor, členství a pořadí řádků v kurzoru je pevné. Kurzor sady klíčů vytvoří dočasnou tabulku v TempDB s jedinečně vytvořenými hodnotami ze sloupců, které používáme v příkazu Select.

Zde jsou důležité body, které je třeba pamatovat na kurzor KEYSET na serveru SQL Server


  • Pokud váš výběrový dotaz používá jakoukoli tabulku bez jedinečného indexu, kurzor KEYSET se jednoduše převede na statický kurzor. Ujistěte se, že všechny tabulky, které používáte v Select Query, mají jedinečný index. To je důležité, protože kurzor KEYSET vytváří jedinečné identifikátory pro řádky pomocí těchto jedinečných hodnot.
  • Pokud vložíme řádky do zdrojové tabulky/tabulek, jakmile je kurzor otevřený. Tyto přílohy nebudou viditelné v již otevřeném kurzoru.
  • Pokud provedeme aktualizaci neklíčových hodnot v základních tabulkách, tyto změny budou viditelné v kurzoru.
  • Pokud aktualizujete hodnotu sloupce Klíč v základní tabulce/tabulkách při otevřeném kurzoru a poté se pokusíte načíst hodnotu. @@FETCH_STATUS vám vrátí -2. Aktualizace provedená uvnitř kurzoru na klíčový sloupec s klauzulí WHERE CURRENT OF bude viditelná na konci kurzoru.
  • Pokud smažete řádek ze základní tabulky/ů, když je kurzor otevřený, a poté se pokusíte načíst tento řádek v kurzoru, @@FETCH_STATUS vrátí hodnotu -2.
  • Kurzory KEYSET lze posouvat.
Je těžké dát sem snímky dohromady se všemi detaily. Navrhoval bych, abyste se podívali na video, abyste viděli, jak možnosti KEYSET fungují ve skutečnosti.

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 ukázka:Co jsou to kurzory KEYSET na serveru SQL a jak funguje kurzor KEYSET

  1. Rychlý způsob, jak zjistit počet řádků tabulky v PostgreSQL

  2. Jakou funkci maskování dat bych měl použít?

  3. Jak vložit více řádků z pole pomocí frameworku CodeIgniter?

  4. Volání nedefinované funkce oci_connect()