SQLShack (Français)

Les curseurs SQL Server sont un sujet courant sur Internet . Vous trouverez des opinions différentes sur le moment de les utiliser et de ne pas le faire. Aujourdhui, nous en parlerons également et répondrons à la question de savoir quand (ne pas) les utiliser.

Le modèle de données et lidée générale

Dans larticle précédent, Introduction à SQL Boucles de serveur, nous avons parlé de boucles SQL Server, mais nous navons pas utilisé les données de la base de données. Cétait étrange, mais cela devrait devenir beaucoup plus clair maintenant. Aujourdhui, tout en expliquant les curseurs, nous utiliserons les données de la base de données pour indiquer quand (ne pas) utiliser les curseurs. Le modèle de données que nous utiliserons est le même que celui que nous utilisons tout au long de cette série.

SQL Server prend en charge 3 différentes implémentations de curseurs – curseurs Transact-SQL, curseurs API et curseurs client. Dans cet article, nous nous concentrerons sur les curseurs Transact-SQL. Vous les reconnaîtrez facilement car ils sont basés sur la syntaxe DECLARE CURSOR.

Curseur SQL Server – Introduction

Avant de passer au code et aux exemples, nous devons expliquer quels curseurs SQL Server sont.

Le curseur SQL Server est une logique T-SQL, qui nous permet de parcourir le résultat de la requête associé. Cela nous permet deffectuer les actions séquentiellement – par exemple, effectuer une mise à jour sur une seule ligne.

Parfois, cela peut (semble être) utile, mais lorsque vous travaillez avec des bases de données, vous ne devriez pas utiliser de modèles de programmation procéduraux mais tenez-vous plutôt à la programmation déclarative. Lune des principales raisons est que les SGBD sont déjà optimisés pour effectuer des actions sur des ensembles de données, et par conséquent, vous ne devriez pas être celui qui essaie dêtre « plus intelligent que le système ».

Pourtant, cest bien pour savoir comment ils fonctionnent. Si rien dautre, vous les rencontrerez peut-être dans le code dont vous héritez, et vous devrez réécrire la logique. Et avant de faire quoi que ce soit, vous devez comprendre comment cela fonctionne.

Donc, au cas où vous auriez besoin de curseurs, voici ce que vous devez savoir à leur sujet:

  • Les curseurs utilisent des variables pour stocker les valeurs renvoyées dans chaque partie de la boucle. Par conséquent, vous devrez DÉCLARER toutes les variables dont vous aurez besoin
  • La prochaine chose à faire est de DECLARE… CURSOR FOR SELECT requête, où vous allez déclarer un curseur et définir également la requête liée à (peupler) ce curseur
  • Vous allez OUVRIR le curseur et FETCH NEXT à partir du curseur
  • Dans la boucle WHILE, vous testerez la variable @@ FETCH_STATUS (WHILE @@ FETCH_STATUS = 0). Si la condition est satisfaite, vous Je vais entrer dans la boucle BEGIN … END bloquez et exécutez des instructions à lintérieur de ce bloc
  • Une fois que vous avez parcouru lensemble du jeu de résultats, vous quitterez la boucle. Vous devez FERMER le curseur et le DEALLOCATE. La désallocation est importante car elle supprimera la définition du curseur et libèrera la mémoire utilisée

Curseur SQL Server – Exemples

Regardons maintenant deux exemples de curseurs. Bien quils soient assez simples, ils expliquent bien le fonctionnement des curseurs.

Dans le premier exemple, nous voulons obtenir tous les identifiants et noms de villes, ainsi que les noms de pays associés. Nous utiliserons la commande PRINT pour imprimer des combinaisons à chaque passage de la boucle.

Utilisation du curseur SQL Server et du while loop a renvoyé exactement ce que nous attendions – les identifiants et les noms de toutes les villes et pays associés que nous avons dans la base de données.

La chose la plus importante à mentionner ici est que nous pourrions simplement renvoyer cet ensemble de résultats en utilisant la requête SQL dorigine stockée dans la partie DECLARE du curseur, donc il ny avait pas besoin de curseur.

Nous allons y aller avec un autre exemple. Cette fois, nous interrogerons la base de données des schémas dinformations pour renvoyer les 5 premières tables classées par nom de table. Bien quil ny ait pas beaucoup de sens à utiliser une telle requête, cet exemple vous montre:

  • Comment interroger la base de données du schéma dinformation
  • Comment combiner quelques commandes / instructions que nous mentionné dans les articles précédents (IF… ELSE, WHILE loop, CONCAT)

Du côté du codage, Je tiens à souligner que cette fois, nous navons rien imprimé en boucle, mais plutôt créé une chaîne en utilisant CONCAT. De plus, nous avons utilisé linstruction IF pour tester si nous sommes dans la première passe, et si cest le cas, nous navons pas ajouté « , ». Sinon, nous ajouterions « , » à la chaîne.

Après la boucle, nous avons imprimé la chaîne de résultat, fermé et désalloué le curseur.

Nous pourrions y parvenir en utilisant la fonction STRING_AGG. Celui-ci est disponible à partir de SQL Server 2017 et est léquivalent de la fonction MySQL GROUP_CONCAT.

Curseur SQL Server – Quand (pas) les utiliser?

Je vais essayer de donnez une réponse objective à la question – « Quand utiliser les curseurs SQL Server et quand pas »? Puisque les choses changent avec le temps et que des améliorations doivent être apportées, soit sur les curseurs, soit sur dautres objets qui les « remplacent », prenez en considération la date à laquelle cet article a été rédigé.Alors, commençons.

Vous ne devriez pas utiliser de curseurs:

  • Presque toujours 🙂 Cela peut sembler stupide, mais cest vrai dans la plupart des cas. SQL Server implémente un grand nombre dobjets & fonctions qui font exactement ce que vous tenteriez probablement de résoudre à laide de curseurs. Avant de décider dutiliser le curseur, assurez-vous davoir suffisamment étudié pour conclure que le curseur est la seule (bonne) solution possible. Même chose pour les boucles dans les bases de données. Dans larticle précédent, Introduction aux boucles SQL Server, nous avons utilisé des boucles, mais pas pour parcourir les données.

Vous pouvez utiliser des curseurs:

  • Principalement pour les tâches dadministration de base de données comme les sauvegardes, les contrôles dintégrité, la reconstruction dindex
  • Pour une seule fois tâches lorsque vous êtes sûr que déventuelles performances médiocres nauront pas dimpact sur les performances globales du système
  • Appeler une procédure stockée plusieurs fois en utilisant différents paramètres. Dans ce cas, vous obtiendrez des paramètres à partir de variables de curseur et effectuer des appels à lintérieur de la boucle

    Lappel dune procédure stockée ou dune autre requête à lintérieur du curseur (ou de la boucle) a un impact considérable sur les performances, car à chaque boucle de curseur, vous exécuterez la requête / procédure depuis le début. Si vous décidez de faire cela, vous devez être conscient des conséquences possibles.

  • Lastuce précédente nous amène à la dernière puce quand vous devez utiliser les curseurs. Si vous êtes parfaitement conscient de leur fonctionnement et que vous êtes certain que cela naura pas dimpact sur les performances, allez-y

Curseur SQL Server – Pourquoi les gens ne les utilisent (pas) ?

La dernière question à laquelle je voudrais répondre est: Pourquoi quelquun utiliserait-il un curseur? Voici comment je vois les choses:

  • Les personnes qui les utilisent pour des emplois ponctuels ou des actions régulières où elles nauront pas dimpact sur les performances ont lexcuse. Lune des raisons est que ce code est du code procédural, et si vous y êtes habitué, il est très lisible
  • Dun autre côté, ceux qui ont commencé à se familiariser avec les bases de données et sont habitués à la programmation procédurale pourraient utilisez des curseurs car, comme mentionné, ils sont beaucoup plus proches de la programmation procédurale que des bases de données. Ce nest pas une raison pour les utiliser, car la seule excuse ici serait que vous ne connaissez tout simplement pas lautre (bonne) façon de faire les choses
  • La chose la plus importante à propos des curseurs est quils sont lentes par rapport aux instructions SQL, et vous devez donc éviter de les utiliser car elles entraîneront tôt ou tard des problèmes de performances (à moins que vous ne sachiez exactement ce que vous faites et pourquoi)

I trouve utile que vous compreniez le concept des curseurs car il y a de grandes chances que vous les rencontriez en cours de route. Ils étaient populaires avant lajout de nouvelles options à SQL Server. De plus, il y a une chance que vous continuiez à travailler sur un système où quelquun avant vous lavez utilisé, et que vous deviez continuer là où ils se sont arrêtés. Vous devrez peut-être remplacer le curseur (code procédural) par SQL (code déclaratif).

Conclusion

Il ny a pas de meilleure conclusion sur les curseurs, que – ne les utilisez pas 🙂 SQL Server a mis en œuvre de nombreux changements qui résolvent des problèmes qui étaient auparavant difficiles à résoudre en utilisant du code déclaratif. Mieux vaut passer du temps à enquêter et à apprendre quelque chose de nouveau, et enfin, à produire un code optimal. Bien sûr, vous pouvez les utiliser si vous savez pourquoi vous faites cela et que vous êtes conscient des problèmes potentiels qui y sont liés.

Table des matières

Apprendre SQL : CREATE DATABASE & Opérations CREATE TABLE

Apprendre SQL: INSÉRER DANS LA TABLE

Apprendre SQL: Clé primaire

Apprendre SQL: Clé étrangère

Apprendre SQL: instruction SELECT

Apprendre SQL: INNER JOIN vs LEFT JOIN

Apprendre SQL: Scripts SQL

Apprendre SQL: Types de relations

Apprendre SQL: Joindre plusieurs tables

Apprendre SQL: fonctions dagrégation

Apprendre SQL: Comment écrire une requête SELECT complexe?

Apprendre SQL: la base de données INFORMATION_SCHEMA

Apprendre SQL: Types de données SQL

Apprendre SQL: Théorie des ensembles

Apprendre SQL: fonctions définies par lutilisateur

Apprendre SQL: procédures stockées définies par lutilisateur

Apprendre SQL: vues SQL

Apprendre SQL: déclencheurs SQL

Apprendre SQL: sexercer aux requêtes SQL

Apprendre SQL: exemples de requêtes SQL

Apprendre SQL: créer un rapport manuellement à laide de requêtes SQL

Apprendre SQL: fonctions de date et dheure SQL Server

Apprendre SQL: créer des rapports SQL Server utilisation des fonctions de date et dheure

Apprenez SQL: tableaux croisés dynamiques SQL Server

Apprenez SQL: exportation SQL Server vers Excel

Apprendre SQL: introduction aux boucles SQL Server

Apprendre SQL: curseurs SQL Server

Apprendre SQL: bonnes pratiques SQL pour la suppression et la mise à jour de données

Apprendre SQL: conventions de dénomination

Apprendre SQL: tâches liées à SQL

Apprendre SQL: jointures non équi dans SQL Server

Apprendre SQL: injection SQL

  • Auteur
  • Messages récents
Emil est un professionnel des bases de données avec plus de 10 ans dexpérience dans tout ce qui concerne les bases de données. Au cours des années, il a travaillé dans lindustrie informatique et financière et travaille maintenant comme pigiste.
Ses engagements passés et présents vont de la conception et du codage de bases de données à lenseignement, au conseil et à la rédaction de bases de données. A ne pas oublier aussi, BI, création dalgorithmes, échecs, philatélie, 2 chiens, 2 chats, 1 femme, 1 bébé …
Vous pouvez le trouver sur LinkedIn
Voir tous les articles dEmil Drkusic

Derniers articles dEmil Drkusic (tout voir)
  • Learn SQL: SQL Injection – 2 novembre 2020
  • Learn SQL: Non-Equi Joins in SQL Server – 29 septembre 2020
  • Learn SQL: Emplois liés à SQL – 1er septembre 2020

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *