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

Typy kursorów programu SQL Server — jaka jest różnica między kursorem LOKALNYM I GLOBALNYM | Samouczek SQL Server / Samouczek TSQL

Kursor lokalny:

Zakres Local Cursor jest ograniczony do partii, procedury składowanej lub wyzwalacza, w którym jest tworzony. Po zakończeniu wsadu, procedury zapisanej lub wyzwalacza. Kursor lokalny nie będzie już dostępny.

KURSOR GLOBALNY:

Zakres GLOBAL Cursor jest ograniczony do połączenia, w którym jest tworzony. Możesz użyć GLOBALNEGO KURSORA w wielu partiach, możesz najpierw otworzyć i pobrać dane w drugim. Możesz także otworzyć KURSORA GLOBALNY w jednej procedurze składowanej i pobrać dane w następnej procedurze składowanej, o ile używają tego samego połączenia.
Jeśli nie użyjesz słowa kluczowego Local lub Global , Kursor zostanie utworzony z TYPE, korzystając z ustawienia bazy danych, jak pokazano poniżej.
Rys. 1:Różnica między kursorem lokalnym a globalnym w SQL Server
Stwórzmy przykładową tabelę, wstawiamy kilka rekordów i przeprowadzamy testy, aby potwierdzić naszą powyższą definicję.

--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
Rys 3:Lokalny kursor w SQL Server
 

Teraz przeprowadźmy test za pomocą Stored Procedure i zobaczmy, jak Local Cursor i Global Cursor działają w Stored Procedure w SQL Server.
--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
 
 
Jeżeli wykonamy powyższą procedurę składowaną, otrzymamy wyniki takie jak na rys. 2. Ponieważ deklarujemy jako typ GLOBALNY, będziemy mogli używać jej w wielu procedurach składowanych, o ile uruchomimy je w to samo połączenie.

Idź dalej i zmień procedurę składowaną i zmień typ z GLOBALNY na Lokalny, a następnie wykonaj procedury. Nawet jeśli jesteśmy w tym samym połączeniu, otrzymamy błąd, który otrzymaliśmy na Fig 3. Ponieważ zakres Cursor jest ograniczony do Batch, Storeed Procedure lub Trigger po zdefiniowaniu jako LOCAL.
Prezentacja wideo:aby zobaczyć szczegółową demonstrację działania kursora lokalnego i globalnego, obejrzyj wideo.
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak używać instrukcji IF/ELSE do aktualizacji lub tworzenia nowego wpisu węzła XML w Sql

  2. Jak zapobiec cykliczności wyzwalacza bazy danych?

  3. Jak zainstalować SQL Server w Red Hat 8?

  4. Zrozumienie rozmiaru pamięci „czas” w SQL Server

  5. Model odzyskiwania zmian SQL Server