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
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
- 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