Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Типове курсори на SQL Server - Каква е разликата между ЛОКАЛЕН И ГЛОБАЛЕН курсор | Урок за SQL Server / Урок за TSQL

Локален курсор:

Обхватът на локалния курсор е ограничен до партидата, съхранената процедура или тригера, в който е създаден. След като пакетът, съхранената процедура или тригерът са завършени. Местният курсор вече няма да бъде наличен за използване.

ГЛОБАЛЕН КУРСОР:

Обхватът на GLOBAL Cursor е ограничен до връзката, в която е създаден. Можете да използвате GLOBAL CURSOR в множество партиди, можете да отворите на първо и да извлечете данните на второ. Можете също да отворите GLOBAL CURSOR в една съхранена процедура и да извлечете данните в следващата съхранена процедура, стига да използват същата връзка.
Ако не използвате ключовата дума Local или Global , курсорът ще бъде създаден с TYPE, като използвате настройката на базата данни, както е показано по-долу.
Фигура 1:Разлика между локален курсор и глобален курсор в SQL Server
Нека създадем примерна таблица и вмъкнете някои записи и направете някакъв тест, за да докажете нашата горна дефиниция.

--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
Фигура 3:Локален курсор в SQL Server
 

Сега нека извършим теста със съхранена процедура и да видим как работят локалният курсор и глобалният курсор в съхранената процедура в 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
 
 
Ако изпълним горната съхранена процедура, ще получим резултатите, както сме получили на фиг. 2. Тъй като сме декларирали тип GLOBAL, ще можем да го използваме в множество запаметени процедури, стига да ги изпълнявате в същата връзка.

Продължете и променете съхранената процедура и променете типа от GLOBAL на Local и след това изпълнете процедурите. Дори и да сме в една и съща връзка, ще получим грешката, която получихме на фиг. 3. Тъй като обхватът на курсора е ограничен до пакетна, съхранена процедура или тригер, след като дефинирате като LOCAL.
Видео демонстрация:За да видите подробната демонстрация как работят локалният курсор и глобалният курсор, гледайте видео.
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намерите местоположението на файловете с данни и регистрационните файлове в SQL Server

  2. Изпълнете командата Insert и върнете вмъкнат идентификатор в Sql

  3. Запазване на ORDER BY в SELECT INTO

  4. Актуализирайте множество колони в SQL

  5. 9 жизненоважни задачи, за които отговарят DBA