T-SQL lucreaza cu record set-uri adica "multimi de inregistrari" (sau set de rezultate) intr-o traducere libera. Programatorii sunt obisnuiti cu o abordare iterativa si atunci s-au introdus cursoarele care permit parcurgerea rand cu rand a unui set de rezultate.
De cele mai multe ori cursoarele pot fi evitate si este de dorit sa facem asta din motive de performanta.
Ca exemplu:
USE tempdb;
GO
CREATE TABLE Intrebari (ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
TextIntrebare VARCHAR(MAX));
GO
INSERT INTO Intrebari(TextIntrebare) SELECT 'Tipuri de date';
INSERT INTO Intrebari(TextIntrebare) SELECT 'Design Tabel';
INSERT INTO Intrebari(TextIntrebare) SELECT 'Ce este un cursor';
GO
-- Exemplu cursor
DECLARE @ID_Intrebare int, @Text_Intrebare nvarchar(MAX);
-- Declaram cursorul
DECLARE intrebari_cursor CURSOR FOR
SELECT ID, TextIntrebare FROM Intrebari
-- Deschidem cursorul
OPEN intrebari_cursor
-- Preluam primul rand in variabilele declarate
FETCH NEXT FROM intrebari_cursor INTO @ID_Intrebare, @Text_Intrebare
-- Cat timp avem inregistrari continuam
WHILE @@FETCH_STATUS = 0
BEGIN
-- Afisam continutul variabilelor
SELECT @ID_Intrebare, @Text_Intrebare
FETCH NEXT FROM intrebari_cursor INTO @ID_Intrebare, @Text_Intrebare
END
-- Inchidem cursorul si il dealocam
CLOSE intrebari_cursor
DEALLOCATE intrebari_cursor
GO
-- Output
1 Tipuri de date
(1 row(s) affected)
2 Design Tabel
(1 row(s) affected)
3 Ce este un cursor
(1 row(s) affected)
Alternativa in acest caz este foarte simpla:
-- Alternativa set based
SELECT ID, TextIntrebare FROM Intrebari
Cristian Andrei Lefter, SQL Server MVP
MCT, MCSA, MCDBA, MCAD, MCSD .NET,
MCTS, MCITP - Database Administrator SQL Server 2005
http://sqlserver.ro