sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server-markörtyper - Vad är skillnaden mellan LOKAL OCH GLOBAL markör | SQL Server Tutorial / TSQL Tutorial

Lokal markör:

Omfattningen av Local Cursor är begränsad till batchen, lagrad procedur eller trigger där den skapas. När batchen, lagrad procedur eller trigger är klar. Den lokala markören kommer inte att vara tillgänglig att använda längre.

GLOBAL MARKÖR:

Omfattningen av GLOBAL Cursor är begränsad till den anslutning där den skapas. Du kan använda GLOBAL CURSOR i flera partier, du kan öppna i första och hämta data i andra. Du kan också öppna den GLOBALA MARKEREN i en lagrad procedur och hämta data i nästa lagrade procedur så länge de använder samma anslutning.
Om du inte skulle använda nyckelordet Local eller Global , skapas markören med TYP genom att använda databasinställningen som visas nedan.
Fig 1:Skillnaden mellan lokal markör och global markör i SQL Server
Låt oss skapa en exempeltabell och infoga några poster och gör några test för att bevisa vår definition ovan.

--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:Lokal markör i SQL Server
 

Låt oss nu utföra testet med lagrad procedur och se hur Local Cursor och Global Cursor fungerar i lagrad procedur i 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
 
 
Om vi ​​kör ovanstående lagrad procedur kommer vi att få resultaten som vi fick i fig 2. Som vi har deklarerat som GLOBAL typ kommer vi att kunna använda den i flera lagrade procedurer så länge du kör dem i samma anslutning.

Fortsätt och ändra den lagrade proceduren och ändra typen från GLOBAL till Local och kör sedan procedurerna. Även vi är i samma anslutning kommer vi att få felet som vi fick i fig 3. Eftersom omfattningen av markören är begränsad till batch, lagrad procedur eller trigger när du definierar som LOKALT.
Videodemo:För att se den detaljerade demonstrationen hur Local Cursor och Global Cursor fungerar, titta på video.
  1. Hur man kontrollerar om en användare klickade på [Avbryt] på en InputBox i VBA

  2. Migrera PostgreSQL-databaser från on-prem till molnet med hjälp av AWS RDS

  3. Gjut int till varchar

  4. Är det möjligt att utföra korsdatabasfrågor med PostgreSQL?