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

Typy kurzoru SQL Server - Jaký je rozdíl mezi LOKÁLNÍM A GLOBÁLNÍM kurzorem | Kurz SQL Server / Kurz TSQL

Místní kurzor:

Rozsah místního kurzoru je omezen na dávku, uloženou proceduru nebo aktivační událost, ve které je vytvořen. Jakmile je dávka, uložená procedura nebo spouštění dokončeno. Místní kurzor již nebude možné používat.

GLOBÁLNÍ KURZOR:

Rozsah GLOBAL Cursor je omezen na připojení, ve kterém je vytvořen. GLOBAL CURSOR můžete použít ve více dávkách, můžete otevřít v první a načíst data ve druhé. Můžete také otevřít GLOBÁLNÍ KURZOR v jedné uložené proceduře a načíst data v další uložené proceduře, pokud používají stejné připojení.
Pokud byste nepoužili klíčové slovo Local nebo Global , bude kurzor vytvořen pomocí TYPE pomocí Nastavení databáze, jak je uvedeno níže.
Obr 1:Rozdíl mezi lokálním a globálním kurzorem na SQL Server
Pojďme vytvořit ukázkovou tabulku a vložte nějaké záznamy a proveďte nějaký test, abyste potvrdili naši výše uvedenou definici.

--drop table dbo.Customer
Create table dbo.Customer ( 
CustomerId Int ,
CustomerName VARCHAR(100),
StreetAddress VARCHAr(100),
City VARCHAR(100),
State CHAR(2))
go

--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'




--Test with GLOBAL Cursor in Multiple Batches. 
use Test
go

DECLARE Customer_Cursor CURSOR 
--use LOCAL OR GLOBAL HERE
GLOBAL 
FOR
Select CustomerID,
CustomerName,
StreetAddress,
City,
State
from dbo.Customer
OPEN Customer_Cursor;
GO

--Terminate the Batch and change the Database 
use TestDB
go
FETCH NEXT FROM Customer_Cursor
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT FROM Customer_Cursor 
   END
CLOSE Customer_Cursor;
GO
DEALLOCATE Customer_Cursor;
GO

We will be able to see the records as we have defined Cursor as GLOBAL and it will be 
available during entire Connection , even we have terminated the first Batch by using GO
statement.


Fig 2: Global Cursor in SQL Server
--Test with LOCAL Cursor in Multiple Batches. 
use Test
go

DECLARE Customer_Cursor CURSOR 
--use LOCAL OR GLOBAL HERE
LOCAL 
FOR
Select CustomerID,
CustomerName,
StreetAddress,
City,
State
from dbo.Customer
OPEN Customer_Cursor;
GO

--Terminate the Batch and change the Database 
use TestDB
go
FETCH NEXT FROM Customer_Cursor
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT FROM Customer_Cursor 
   END
CLOSE Customer_Cursor;
GO
DEALLOCATE Customer_Cursor;
GO
 
 
As the scope for LOCAL Cursor is limited to Batch, Stored Procedure or Trigger, The second batch is not able to see the Cursor as we have defined LOCAL Cursor type in our above query
Obr. 3:Místní kurzor na serveru SQL
 

Nyní provedeme test s uloženou procedurou a uvidíme, jak funguje místní kurzor a globální kurzor v uložené proceduře na serveru SQL.
--Test with LOCAL Cursor in Multiple Batches. 
use Test
go

Create Procedure Dec_Cursor_Customer AS
BEGIN
DECLARE Customer_Cursor CURSOR 
--use LOCAL OR GLOBAL HERE
GLOBAL 
FOR
Select CustomerID,
CustomerName,
StreetAddress,
City,
State
from dbo.Customer
OPEN Customer_Cursor;
END

GO
Create Procedure Fetch_Cusor_Customer
AS 
BEGIN
FETCH NEXT FROM Customer_Cursor
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT FROM Customer_Cursor 
   END
END

--Execute the Procedures to What we get with GLOBAL and LOCAL Cursor Type

EXEC Dec_Cursor_Customer
GO
EXEC Fetch_Cusor_Customer
CLOSE Customer_Cursor;
GO
DEALLOCATE Customer_Cursor;
GO
 
 
Pokud provedeme výše uvedenou uloženou proceduru, dostaneme výsledky jako na obr. 2. Jak jsme deklarovali jako typ GLOBAL, budeme ji moci používat ve více uložených procedurách, pokud je spustíte v stejné spojení.

Pokračujte a změňte uloženou proceduru a změňte typ z GLOBAL na Local a poté spusťte procedury. I když jsme ve stejném spojení, dostaneme chybu, kterou jsme dostali na obr. 3. Protože rozsah kurzoru je omezen na dávku, uloženou proceduru nebo spouštění, jakmile jej definujete jako LOCAL.
Video demo:Chcete-li vidět podrobné demo, jak funguje místní kurzor a globální kurzor, podívejte se na video.
  1. Dotaz PostgreSQL pro vrácení výsledků jako seznam oddělený čárkami

  2. PostgreSQL:CIZÍ KLÍČ/ON DELETE CASCADE

  3. Kód entitního rámce je pomalý při použití Include() mnohokrát

  4. Vyberte náhodný řádek pro každou skupinu