sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server-markørtyper - Hvad er forskellen mellem LOKAL OG GLOBAL markør | SQL Server Tutorial / TSQL Tutorial

Lokal markør:

Omfanget af Local Cursor er begrænset til den batch, lagrede procedure eller trigger, hvori den er oprettet. Når batchen, lagret procedure eller trigger er fuldført. Den lokale markør vil ikke længere være tilgængelig til brug.

GLOBAL MARKØR:

Omfanget af GLOBAL Cursor er begrænset til den forbindelse, hvori den oprettes. Du kan bruge GLOBAL CURSOR i flere batches, du kan åbne i først og hente dataene i anden. Du kan også åbne den GLOBALE MARKØR i en lagret procedure og hente dataene i den næste lagrede procedure, så længe de bruger den samme forbindelse.
Hvis du ikke vil bruge søgeordet Lokal eller Global , vil markøren blive oprettet med TYPE ved at bruge databaseindstillingen som vist nedenfor.
Fig 1:Forskellen mellem lokal markør og global markør i SQL Server
Lad os oprette en eksempeltabel og indsæt nogle poster og lav en test for at bevise vores definition ovenfor.

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

Lad os nu udføre testen med Stored Procedure og se, hvordan Local Cursor og Global Cursor fungerer i Stored Procedure 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
 
 
Hvis vi udfører ovenstående Stored Procedure, vil vi få resultaterne som vi fik i Fig. 2. Som vi har erklæret som GLOBAL type, vil vi være i stand til at bruge det i flere Stored Procedure, så længe du kører dem i samme forbindelse.

Gå videre og ændr den lagrede procedure og skift typen fra GLOBAL til Local og udfør derefter procedurerne. Selv vi er i samme forbindelse, vil vi få fejlen, som vi fik i Fig. 3. Da markørens omfang er begrænset til Batch, Lagret Procedure eller Trigger, når du først definerer som LOKAL.
Videodemo:Se video for at se den detaljerede demo, hvordan Local Cursor og Global Cursor fungerer.
  1. SqlParameter tillader ikke tabelnavn - andre muligheder uden sql-injektionsangreb?

  2. Brug Cloud Formation-skabeloner til at oprette MySQL-forekomster på RDS

  3. Sådan sikkerhedskopieres din Moodle MySQL-database

  4. Hvordan stopper/dræber man en forespørgsel i postgresql?