Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Tipos de Cursor do SQL Server - Qual é a Diferença entre Cursor LOCAL E GLOBAL | Tutorial SQL Server / Tutorial TSQL

Cursor local:

O escopo do Cursor Local é limitado ao lote, procedimento armazenado ou gatilho no qual ele é criado. Assim que o Lote, Procedimento Armazenado ou Acionador estiver concluído. O Cursor Local não estará mais disponível para uso.

CURSOR GLOBAL:

O escopo do GLOBAL Cursor é limitado à conexão na qual ele é criado. Você pode usar o GLOBAL CURSOR em vários lotes, pode abrir primeiro e buscar os dados em segundo. Você também pode abrir o GLOBAL CURSOR em um Stored Procedure e buscar os dados no próximo Stored Procedure desde que estejam usando a mesma conexão.
Se você não usar a palavra-chave Local ou Global , o Cursor será criado com TYPE usando a configuração do banco de dados conforme mostrado abaixo.
Fig 1:Diferença entre Cursor Local e Cursor Global no SQL Server
Vamos criar uma tabela de amostra e insira alguns registros e faça alguns testes para provar nossa definição acima.

--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
Fig 3:Cursor local no SQL Server
 

Agora vamos realizar o teste com Stored Procedure e ver como o Cursor Local e o Cursor Global funcionam no Stored Procedure no 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
 
 
Se executarmos o procedimento armazenado acima, obteremos os resultados como obtivemos na Fig 2. Como declaramos como tipo GLOBAL, poderemos usá-lo em vários procedimentos armazenados, desde que você os execute em mesma conexão.

Vá em frente e altere o Stored Procedure e mude o tipo de GLOBAL para Local e então execute os procedimentos. Mesmo que estejamos na mesma conexão, obteremos o erro que obtivemos na Fig 3. Como o escopo do Cursor é limitado a Batch, Stored Procedure ou Trigger uma vez que você define como LOCAL.
Vídeo Demo:Para ver a demonstração detalhada de como o Cursor Local e o Cursor Global funcionam, assista ao vídeo.