logo

Cursorul în SQL Server

Un cursor în SQL Server este un d obiect atabase care ne permite să extragem fiecare rând la un moment dat și să îi manipulăm datele . Un cursor nu este altceva decât un indicator către un rând. Este întotdeauna folosit împreună cu o instrucțiune SELECT. Este de obicei o colecție de SQL logică care trece printr-un număr predeterminat de rânduri unul câte unul. O ilustrare simplă a cursorului este atunci când avem o bază de date extinsă de înregistrări ale lucrătorilor și dorim să calculăm salariul fiecărui muncitor după deducerea impozitelor și a concediilor.

Serverul SQL scopul cursorului este de a actualiza datele rând cu rând, de a le modifica sau de a efectua calcule care nu sunt posibile atunci când recuperăm toate înregistrările simultan . Este, de asemenea, util pentru a efectua sarcini administrative, cum ar fi backup-urile bazei de date SQL Server, în ordine secvențială. Cursoarele sunt utilizate în principal în procesele de dezvoltare, DBA și ETL.

Acest articol explică totul despre cursorul SQL Server, cum ar fi ciclul de viață al cursorului, de ce și când este utilizat cursorul, cum să implementăm cursoarele, limitările acestuia și cum putem înlocui un cursor.

Ciclul de viață al cursorului

Putem descrie ciclul de viață al unui cursor în cinci secțiuni diferite după cum urmează:

Cursorul în SQL Server

1: Declara cursorul

Primul pas este să declarați cursorul utilizând instrucțiunea SQL de mai jos:

cum să blochezi reclamele youtube pe Android
 DECLARE cursor_name CURSOR FOR select_statement; 

Putem declara un cursor specificând numele acestuia cu tipul de date CURSOR după cuvântul cheie DECLARE. Apoi, vom scrie instrucțiunea SELECT care definește ieșirea pentru cursor.

2: Deschideți cursorul

Este un al doilea pas în care deschidem cursorul pentru a stoca datele preluate din setul de rezultate. Putem face acest lucru utilizând instrucțiunea SQL de mai jos:

 OPEN cursor_name; 

3: Preluați cursorul

Este un al treilea pas în care rândurile pot fi preluate unul câte unul sau într-un bloc pentru a efectua manipularea datelor, cum ar fi operațiuni de inserare, actualizare și ștergere pe rândul activ în prezent din cursor. Putem face acest lucru utilizând instrucțiunea SQL de mai jos:

 FETCH NEXT FROM cursor INTO variable_list; 

Putem folosi și Funcția @@FETCHSTATUS în SQL Server pentru a obține starea celui mai recent cursor de instrucțiune FETCH care a fost executat împotriva cursorului. The FETCH Declarația a avut succes când @@FETCHSTATUS dă rezultate zero. The IN TIMP CE instrucțiunea poate fi folosită pentru a prelua toate înregistrările de pe cursor. Următorul cod explică mai clar:

 WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cursor_name; END; 

4: Închideți cursorul

Este al patrulea pas în care cursorul ar trebui să fie închis după ce am terminat lucrul cu un cursor. Putem face acest lucru folosind instrucțiunea SQL de mai jos:

 CLOSE cursor_name; 

5: Dealocarea cursorului

Este al cincilea și ultimul pas în care vom șterge definiția cursorului și vom elibera toate resursele de sistem asociate cu cursorul. Putem face acest lucru utilizând instrucțiunea SQL de mai jos:

 DEALLOCATE cursor_name; 

Utilizări ale cursorului SQL Server

Știm că sistemele de gestionare a bazelor de date relaționale, inclusiv SQL Server, sunt excelente în manipularea datelor pe un set de rânduri numit seturi de rezultate. De exemplu , avem o masă tabel_produse care contine descrierile produselor. Dacă vrem să actualizăm Preț a produsului, apoi cele de mai jos ' ACTUALIZAȚI' interogarea va actualiza toate înregistrările care corespund condiției din „ UNDE' clauză:

 UPDATE product_table SET unit_price = 100 WHERE product_id = 105; 

Uneori, aplicația trebuie să proceseze rândurile într-o manieră singleton, adică pe rând cu rând, mai degrabă decât întregul set de rezultate dintr-o dată. Putem face acest proces folosind cursoare în SQL Server. Înainte de a folosi cursorul, trebuie să știm că cursoarele sunt foarte proaste ca performanță, așa că ar trebui să se folosească întotdeauna numai atunci când nu există nicio opțiune în afară de cursor.

Cursorul folosește aceeași tehnică ca și noi bucle precum FOREACH, FOR, WHILE, DO WHILE pentru a repeta câte un obiect în toate limbajele de programare. Prin urmare, ar putea fi ales deoarece aplică aceeași logică ca și procesul de loop al limbajului de programare.

listează java în matrice

Tipuri de cursore în SQL Server

Următoarele sunt diferitele tipuri de cursoare din SQL Server enumerate mai jos:

  • Cursore statice
  • Cursore dinamice
  • Cursore numai înainte
  • Cursore de taste
Cursorul în SQL Server

Cursore statice

Setul de rezultate afișat de cursorul static este întotdeauna același ca atunci când cursorul a fost deschis pentru prima dată. Deoarece cursorul static va stoca rezultatul în tempdb , sunt mereu numai pentru citire . Putem folosi cursorul static pentru a ne deplasa atât înainte, cât și înapoi. Spre deosebire de alte cursoare, este mai lent și consumă mai multă memorie. Ca rezultat, îl putem folosi numai atunci când derularea este necesară și alte cursoare nu sunt potrivite.

Acest cursor arată rândurile care au fost eliminate din baza de date după ce a fost deschisă. Un cursor static nu reprezintă operațiuni INSERT, UPDATE sau DELETE (cu excepția cazului în care cursorul este închis și redeschis).

Cursore dinamice

Cursoarele dinamice sunt opuse cursorelor statice care ne permit să efectuăm operațiunile de actualizare, ștergere și inserare a datelor în timp ce cursorul este deschis. Este defilabil în mod implicit . Poate detecta toate modificările aduse rândurilor, ordinii și valorilor din setul de rezultate, indiferent dacă modificările au loc în interiorul cursorului sau în afara acestuia. În afara cursorului, nu putem vedea actualizările până când nu sunt comise.

Cursore numai înainte

Este tipul de cursor implicit și cel mai rapid dintre toate cursoarele. Se numește cursor numai înainte, deoarece acesta se deplasează numai înainte prin setul de rezultate . Acest cursor nu acceptă derularea. Poate prelua doar rânduri de la începutul până la sfârșitul setului de rezultate. Ne permite să efectuăm operațiuni de inserare, actualizare și ștergere. Aici, efectul operațiunilor de inserare, actualizare și ștergere efectuate de utilizator care afectează rândurile din setul de rezultate sunt vizibile pe măsură ce rândurile sunt preluate de pe cursor. Când rândul a fost preluat, nu putem vedea modificările aduse rândurilor prin intermediul cursorului.

Cursoarele de tip Forward-Only sunt trei clasificate în trei tipuri:

  1. Set de chei Forward_Only
  2. Forward_Only Static
  3. Repede inainte
Cursorul în SQL Server

Cursore comandate prin taste

Această funcționalitate a cursorului se află între un cursor static și unul dinamic în ceea ce priveşte capacitatea sa de a detecta schimbări. Nu poate detecta întotdeauna modificări în apartenența și ordinea setului de rezultate ca un cursor static. Poate detecta modificări ale valorilor rândurilor setului de rezultate ca un cursor dinamic. Se poate doar treceți de la primul la ultimul și ultimul la primul rând . Ordinea și calitatea de membru sunt fixate ori de câte ori acest cursor este deschis.

Este operat de un set de identificatori unici la fel ca și cheile din setul de chei. Setul de chei este determinat de toate rândurile care au calificat instrucțiunea SELECT atunci când cursorul a fost deschis pentru prima dată. De asemenea, poate detecta orice modificare a sursei de date, care acceptă operațiuni de actualizare și ștergere. Este derulabil în mod implicit.

Implementarea Exemplului

Să implementăm exemplul cursorului în serverul SQL. Putem face acest lucru creând mai întâi un tabel numit „ client ' folosind declarația de mai jos:

 CREATE TABLE customer ( id int PRIMARY KEY, c_name nvarchar(45) NOT NULL, email nvarchar(45) NOT NULL, city nvarchar(25) NOT NULL ); 

În continuare, vom introduce valori în tabel. Putem executa instrucțiunea de mai jos pentru a adăuga date într-un tabel:

 INSERT INTO customer (id, c_name, email, city) VALUES (1,'Steffen', '[email protected]', 'Texas'), (2, 'Joseph', '[email protected]', 'Alaska'), (3, 'Peter', '[email protected]', 'California'), (4,'Donald', '[email protected]', 'New York'), (5, 'Kevin', '[email protected]', 'Florida'), (6, 'Marielia', '[email protected]', 'Arizona'), (7,'Antonio', '[email protected]', 'New York'), (8, 'Diego', '[email protected]', 'California'); 

Putem verifica datele prin executarea SELECTAȚI afirmație:

 SELECT * FROM customer; 

După executarea interogării, putem vedea rezultatul de mai jos unde avem opt rânduri în tabel:

Cursorul în SQL Server

Acum, vom crea un cursor pentru a afișa înregistrările clienților. Fragmentele de cod de mai jos explică toți pașii declarării sau creării cursorului, punând totul împreună:

coduri de culoare java
 --Declare the variables for holding data. DECLARE @id INT, @c_name NVARCHAR(50), @city NVARCHAR(50) --Declare and set counter. DECLARE @Counter INT SET @Counter = 1 --Declare a cursor DECLARE PrintCustomers CURSOR FOR SELECT id, c_name, city FROM customer --Open cursor OPEN PrintCustomers --Fetch the record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city --LOOP UNTIL RECORDS ARE AVAILABLE. WHILE @@FETCH_STATUS = 0 BEGIN IF @Counter = 1 BEGIN PRINT 'id' + CHAR(9) + 'c_name' + CHAR(9) + CHAR(9) + 'city' PRINT '--------------------------' END --Print the current record PRINT CAST(@id AS NVARCHAR(10)) + CHAR(9) + @c_name + CHAR(9) + CHAR(9) + @city --Increment the counter variable SET @Counter = @Counter + 1 --Fetch the next record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city END --Close the cursor CLOSE PrintCustomers --Deallocate the cursor DEALLOCATE PrintCustomers 

După executarea unui cursor, vom obține rezultatul de mai jos:

Cursorul în SQL Server

Limitări ale cursorului SQL Server

Un cursor are anumite limitări, astfel încât ar trebui să fie utilizat întotdeauna numai atunci când nu există nicio opțiune în afară de cursor. Aceste limitări sunt:

  • Cursorul consumă resurse de rețea necesitând o călătorie dus-întors în rețea de fiecare dată când preia o înregistrare.
  • Un cursor este un set de pointeri rezidenți în memorie, ceea ce înseamnă că este nevoie de o anumită memorie pe care alte procese ar putea-o folosi pe mașina noastră.
  • Impune blocări asupra unei părți a tabelului sau a întregului tabel atunci când procesează datele.
  • Performanța și viteza cursorului sunt mai lente, deoarece actualizează înregistrările tabelului câte un rând.
  • Cursoarele sunt mai rapide decât buclele while, dar au mai multă supraîncărcare.
  • Numărul de rânduri și coloane introduse în cursor este un alt aspect care afectează viteza cursorului. Se referă la cât timp este nevoie pentru a deschide cursorul și a executa o instrucțiune de preluare.

Cum putem evita cursoarele?

Sarcina principală a cursoarelor este de a parcurge tabelul rând cu rând. Cel mai simplu mod de a evita cursoarele sunt prezentate mai jos:

Folosind bucla SQL while

Cel mai simplu mod de a evita utilizarea unui cursor este folosirea unei bucle while care permite inserarea unui set de rezultate în tabelul temporar.

Funcții definite de utilizator

Uneori, cursoarele sunt folosite pentru a calcula setul de rânduri rezultat. Putem realiza acest lucru folosind o funcție definită de utilizator care îndeplinește cerințele.

Utilizarea Joinurilor

Join procesează numai acele coloane care îndeplinesc condiția specificată și astfel reduce liniile de cod care oferă performanțe mai rapide decât cursoarele în cazul în care trebuie procesate înregistrări uriașe.