web-dev-qa-db-fra.com

Quelle est l'utilisation d'un curseur dans SQL Server?

Je veux utiliser un curseur de base de données; Il me faut d’abord comprendre son utilisation et sa syntaxe, et dans quel scénario l’utiliser dans des procédures stockées? Existe-t-il différentes syntaxes pour différentes versions de SQL Server?

Quand est-il nécessaire d'utiliser?

23
Red Swan

Les curseurs sont un mécanisme permettant d'énumérer explicitement les lignes d'un ensemble de résultats, plutôt que de les récupérer en tant que tels.

Toutefois, s’ils peuvent être plus faciles à utiliser pour les programmeurs habitués à écrire While Not RS.EOF Do ..., ils doivent généralement être évités autant que possible dans les procédures stockées de SQL Server - si vous pouvez écrire une requête sans utiliser de curseur, vous l'optimiseur a beaucoup plus de chances de trouver un moyen rapide de le mettre en œuvre.

En toute honnêteté, je n’ai jamais trouvé de scénario réaliste pour un curseur qui ne pouvait être évité, à l’exception de quelques tâches administratives telles que la boucle sur tous les index du catalogue et leur reconstruction. J'imagine qu'ils peuvent utiliser la génération de rapports ou la fusion de courrier, mais il est probablement plus efficace de faire un travail similaire à celui du curseur dans une application qui communique avec la base de données, laissant ainsi au moteur de base de données ce qu'il fait le mieux: manipuler les ensembles.

34
Jeffrey Hantin

les curseurs sont utilisés car dans la sous-requête, nous pouvons récupérer les enregistrements ligne par ligne donc nous utilisons le curseur pour chercher des enregistrements

Exemple de curseur:

DECLARE @eName varchar(50), @job varchar(50)

DECLARE MynewCursor CURSOR -- Declare cursor name

FOR
Select eName, job FROM emp where deptno =10

OPEN MynewCursor -- open the cursor

FETCH NEXT FROM MynewCursor
INTO @eName, @job

PRINT @eName + ' ' + @job -- print the name

WHILE @@FETCH_STATUS = 0

BEGIN

FETCH NEXT FROM MynewCursor 
INTO @ename, @job

PRINT @eName +' ' + @job -- print the name

END

CLOSE MynewCursor

DEALLOCATE MynewCursor

SORTIE:

ROHIT                           PRG  
jayesh                          PRG
Rocky                           prg
Rocky                           prg
15
rohit vyas

Le curseur peut être utilisé pour récupérer des données ligne par ligne base.il agit comme une instruction de bouclage (c'est-à-dire une boucle ou pour une boucle) . Pour utiliser des curseurs dans des procédures SQL, vous devez procéder comme suit: qui définit un jeu de résultats . 2.Ouvrez le curseur pour établir le jeu de résultats . 3.Faites les données en variables locales selon vos besoins à partir du curseur, une ligne à la fois . 4.Fermez le curseur lorsque vous avez terminé.

pour ex:

declare @tab table
(
Game varchar(15),
Rollno varchar(15)
)
insert into @tab values('Cricket','R11')
insert into @tab values('VollyBall','R12')

declare @game  varchar(20)
declare @Rollno varchar(20)

declare cur2 cursor for select game,rollno from @tab 

open cur2

fetch next from cur2 into @game,@rollno

WHILE   @@FETCH_STATUS = 0   
begin

print @game

print @rollno

FETCH NEXT FROM cur2 into @game,@rollno

end

close cur2

deallocate cur2
7
Murugan

Le curseur lui-même est un itérateur (comme WHILE). Par itérateur, je veux dire un moyen de parcourir le jeu d’enregistrements (c’est-à-dire un ensemble de lignes de données sélectionnées) et d’effectuer des opérations dessus. Les opérations peuvent être INSERT ou DELETE par exemple. Par conséquent, vous pouvez l'utiliser pour la récupération de données par exemple. Cursor fonctionne séquentiellement avec les lignes du jeu de résultats - ligne par ligne. Un curseur peut être considéré comme un pointeur sur une ligne dans un ensemble de lignes et ne peut référencer qu'une ligne à la fois, mais peut être déplacé vers d'autres lignes du jeu de résultats selon les besoins.

Ce link can a une explication claire de sa syntaxe et contient des informations supplémentaires ainsi que des exemples.

Les curseurs peuvent également être utilisés dans Sprocs. C’est un raccourci qui vous permet d’utiliser une requête pour effectuer une tâche au lieu de plusieurs requêtes. Cependant, les curseurs reconnaissent la portée et sont considérés comme non définis en dehors de la portée du sproc et leurs opérations s'exécutent au sein d'une procédure unique. Une procédure stockée ne peut pas ouvrir, extraire ou fermer un curseur qui n'a pas été déclaré dans la procédure. 

0
ElGrig

Je dirais que vous souhaiterez peut-être utiliser un curseur pour comparer des caractéristiques situées sur différentes lignes du jeu de retour ou pour écrire un format de ligne de sortie différent de celui standard, dans certains cas. Deux exemples me viennent à l’esprit:

  1. L'un d'entre eux était dans un collège où chaque classe d'une classe à l'autre avait sa propre rangée dans le tableau. C'était peut-être une mauvaise conception, mais vous deviez comparer plusieurs lignes pour savoir combien de lignes ajouter et supprimer pour déterminer si la personne faisait partie de la classe. Je ne peux pas penser à un moyen simple de faire cela avec seulement SQL. 

  2. Un autre exemple consiste à écrire une ligne de total de journal pour GL. Vous obtenez un nombre arbitraire de débits et de crédits dans votre journal, vous avez plusieurs journaux dans votre déclaration d'ensemble de lignes et vous souhaitez écrire une ligne de total de journal chaque fois que vous terminez un journal pour l'enregistrer dans un grand livre. Avec un curseur, vous pouvez savoir quand vous avez quitté un journal et en commencé un autre, disposer d'accumulateurs pour vos débits et crédits et écrire une ligne de total du journal (ou insertion de table) différente de la ligne de débit/crédit.

0
flashgordon