SQLShack (Deutsch)
SQL Server-Cursor sind ein häufiges Thema im Internet . Sie werden unterschiedliche Meinungen finden, wann Sie sie verwenden und wann nicht. Heute werden wir auch darüber sprechen und die Frage beantworten, wann (nicht) sie verwendet werden sollen.
Das Datenmodell und die allgemeine Idee
Im vorherigen Artikel, Einführung in SQL Serverschleifen, wir haben über SQL Server-Schleifen gesprochen, aber wir haben keine Daten aus der Datenbank verwendet. Das war seltsam, aber das sollte jetzt viel klarer werden. Während wir heute Cursor erklären, werden wir die Daten aus der Datenbank verwenden, um zu zeigen, wann (nicht) Cursor verwendet werden sollen. Das Datenmodell, das wir verwenden, ist das gleiche, das wir in dieser Serie verwenden.
SQL Server unterstützt 3 verschiedene Implementierungen von Cursorn – Transact-SQL-Cursor, API-Cursor und Client-Cursor. In diesem Artikel konzentrieren wir uns auf Transact-SQL-Cursor. Sie werden sie leicht erkennen, da sie auf der DECLARE CURSOR-Syntax basieren.
SQL Server-Cursor – Einführung
Bevor wir zu Code und Beispielen übergehen, sollten wir erklären, welche SQL Server-Cursor verwendet werden sind.
Der SQL Server-Cursor ist eine T-SQL-Logik, mit der wir das zugehörige Abfrageergebnis durchlaufen können. Auf diese Weise können wir die Aktionen nacheinander ausführen, z. B. eine Aktualisierung für eine einzelne Zeile durchführen.
Manchmal kann dies (scheint) hilfreich sein, aber wenn Sie mit Datenbanken arbeiten, sollten Sie keine prozeduralen Programmiermuster verwenden sondern bleiben Sie bei der deklarativen Programmierung. Einer der Hauptgründe ist, dass DBMS bereits für die Ausführung von Aktionen für Datensätze optimiert sind. Daher sollten Sie nicht derjenige sein, der versucht, „intelligenter als das System“ zu sein.
Trotzdem ist es gut Wenn nichts anderes, werden Sie sie vielleicht in dem Code treffen, den Sie erben, und Sie müssen die Logik neu schreiben. Und bevor Sie etwas tun, sollten Sie verstehen, wie es funktioniert.
Wenn Sie also Cursor benötigen, sollten Sie Folgendes über diese wissen:
- Cursor verwenden Variablen, um in jedem Teil der Schleife zurückgegebene Werte zu speichern. Daher müssen Sie DECLARE Alle Variablen, die Sie benötigen
- Als Nächstes müssen Sie die Abfrage… CURSOR FOR SELECT deklarieren, in der Sie einen Cursor deklarieren und auch die Abfrage definieren, die sich auf diesen Cursor bezieht ()
- Sie öffnen den Cursor und FETCH NEXT vom Cursor aus.
- In der WHILE-Schleife testen Sie die Variable @@ FETCH_STATUS (WHILE @@ FETCH_STATUS = 0). Wenn die Bedingung erfüllt ist, Sie Ich betrete die Schleife BEGIN … END blockieren und Anweisungen in diesem Block ausführen
- Nachdem Sie die gesamte Ergebnismenge durchlaufen haben, verlassen Sie die Schleife. Sie sollten den Cursor schließen und ihn zuordnen. Die Freigabe der Zuordnung ist wichtig, da hierdurch die Cursordefinition gelöscht und der verwendete Speicher freigegeben wird.
SQL Server-Cursor – Beispiele
Schauen wir uns nun zwei Cursor-Beispiele an. Obwohl sie ziemlich einfach sind, erklären sie gut, wie Cursor funktionieren.
Im ersten Beispiel möchten wir alle Stadt-IDs und -Namen zusammen mit den zugehörigen Ländernamen abrufen. Wir werden den Befehl PRINT verwenden, um Kombinationen in jedem Durchgang der Schleife zu drucken.
Verwenden des SQL Server-Cursors und des while-Schleife hat genau das zurückgegeben, was wir erwartet haben – IDs und Namen aller Städte und verwandten Länder, die wir in der Datenbank haben.
Das Wichtigste, was hier zu erwähnen ist, ist, dass wir diese Ergebnismenge einfach zurückgeben können Verwenden Sie die ursprüngliche SQL-Abfrage, die im DECLARE-Teil des Cursors gespeichert ist, sodass kein Cursor erforderlich ist.
Wir werden gehen mit einem weiteren Beispiel. Dieses Mal werden wir die Informationsschemadatenbank abfragen, um die ersten 5 nach Tabellennamen geordneten Tabellen zurückzugeben. Obwohl die Verwendung einer solchen Abfrage wenig sinnvoll ist, zeigt Ihnen dieses Beispiel:
- Abfragen der Informationsschemadatenbank
- Kombinieren einiger Befehle / Anweisungen, die wir In früheren Artikeln erwähnt (IF… ELSE, WHILE-Schleife, CONCAT)
Von der Codierungsseite, Ich möchte betonen, dass wir diesmal nichts in einer Schleife gedruckt haben, sondern mit CONCAT einen String erstellt haben. Außerdem haben wir die IF-Anweisung verwendet, um zu testen, ob wir uns im ersten Durchgang befinden. In diesem Fall haben wir „,“ nicht hinzugefügt. Andernfalls würden wir der Zeichenfolge „,“ hinzufügen.
Nach der Schleife haben wir die Ergebniszeichenfolge gedruckt, den Cursor geschlossen und freigegeben.
Dies können wir mit der Funktion STRING_AGG erreichen. Dieser ist ab SQL Server 2017 verfügbar und entspricht der MySQL GROUP_CONCAT-Funktion.
SQL Server-Cursor – Wann (nicht) soll er verwendet werden?
Ich werde es versuchen Geben Sie eine objektive Antwort auf die Frage: „Wann sollten Sie SQL Server-Cursor verwenden und wann nicht?“ Da sich die Dinge im Laufe der Zeit ändern und Verbesserungen vorgenommen werden sollen, sollten Sie entweder Cursor oder andere Objekte berücksichtigen, die sie „ersetzen“ das Datum, an dem dieser Artikel geschrieben wurde.Beginnen wir also.
Sie sollten keine Cursor verwenden:
- Fast immer 🙂 Das klingt vielleicht dumm, ist aber in den meisten Fällen wahr. SQL Server implementiert eine große Anzahl von Objektfunktionen &, die genau das tun, was Sie wahrscheinlich mit Cursorn lösen möchten. Bevor Sie sich für den Cursor entscheiden, stellen Sie sicher, dass Sie genügend Nachforschungen angestellt haben, um zu dem Schluss zu gelangen, dass der Cursor die einzig mögliche (gute) Lösung ist. Gleiches steht für Schleifen in Datenbanken. Im vorherigen Artikel, Einführung in SQL Server-Schleifen, haben wir Schleifen verwendet, jedoch keine Datenschleifen.
Sie können Cursor verwenden:
- Meistens für Datenbankverwaltungsaufgaben wie Sicherungen, Integritätsprüfungen, Wiederherstellen von Indizes
- Einmalig Aufgaben, bei denen Sie sicher sind, dass eine möglicherweise schlechte Leistung die Gesamtsystemleistung nicht beeinträchtigt.
-
Rufen Sie eine gespeicherte Prozedur einige Male mit unterschiedlichen Parametern auf. In diesem Fall würden Sie Parameter von Cursor-Variablen abrufen und Aufrufe innerhalb der Schleife ausführen.
Das Aufrufen einer gespeicherten Prozedur oder einer anderen Abfrage innerhalb des Cursors (oder der Schleife) wirkt sich stark auf die Leistung aus, da in jedem Schritt der Mit der Cursorschleife führen Sie die Abfrage / Prozedur von Anfang an aus. Wenn Sie sich dazu entschließen, sollten Sie sich der möglichen Konsequenzen bewusst sein.
- Der vorherige Hinweis bringt uns zum letzten Punkt, wenn Sie Cursor verwenden sollten. Wenn Sie genau wissen, wie sie funktionieren, und Sie ziemlich sicher sind, dass sie die Leistung nicht beeinträchtigen, wählen Sie sie aus.
SQL Server-Cursor – Warum Benutzer sie (nicht) verwenden ?
Die letzte Frage, die ich beantworten möchte, lautet: Warum sollte jemand einen Cursor verwenden? So sehe ich das:
- Personen, die sie für einmalige Jobs oder regelmäßige Aktionen verwenden, bei denen sie die Leistung nicht beeinträchtigen, haben die Entschuldigung. Einer der Gründe ist, dass es sich bei diesem Code um prozeduralen Code handelt. Wenn Sie daran gewöhnt sind, ist er sehr gut lesbar.
- Auf der anderen Seite können diejenigen, die angefangen haben, sich mit Datenbanken vertraut zu machen und an prozedurale Programmierung gewöhnt sind Verwenden Sie Cursor, da sie, wie bereits erwähnt, der prozeduralen Programmierung viel näher stehen als den Datenbanken. Dies ist kein Grund, sie zu verwenden, da die einzige Entschuldigung hier darin besteht, dass Sie einfach nicht wissen, wie Sie die Dinge auf die andere (richtige) Weise erledigen können.
- Das Wichtigste an Cursorn ist, dass sie sind im Vergleich zu SQL-Anweisungen langsam und sollten daher nicht verwendet werden, da sie früher oder später zu Leistungsproblemen führen (es sei denn, Sie wissen genau, was Sie tun und warum).
I. finde es nützlich, dass du das Konzept der Cursor verstehst, weil es eine große Chance gibt, dass du sie auf dem Weg triffst. Sie waren beliebt, bevor einige neue Optionen zu SQL Server hinzugefügt wurden. Es besteht auch die Möglichkeit, dass Sie an einem System weiterarbeiten, auf dem jemand, bevor Sie ihn verwendet haben, weiterarbeiten muss. Möglicherweise müssen Sie den Cursor (prozeduraler Code) durch SQL (deklarativen Code) ersetzen.
Schlussfolgerung
Es gibt keine bessere Schlussfolgerung für Cursor, als – verwenden Sie sie nicht 🙂 SQL Server hat viele Änderungen implementiert, die Probleme lösen, die zuvor mit deklarativem Code nur schwer zu lösen waren. Verbringen Sie lieber etwas Zeit damit, etwas Neues zu untersuchen und zu lernen und schließlich optimalen Code zu erstellen. Natürlich können Sie sie verwenden, wenn Sie wissen, warum Sie das tun, und wenn Sie sich möglicher Probleme bewusst sind.
Inhaltsverzeichnis
Lernen Sie SQL : CREATE DATABASE & CREATE TABLE-Operationen
SQL lernen: INSERT IN TABLE
SQL lernen: Primärschlüssel
SQL lernen: Fremdschlüssel
SQL lernen: SELECT-Anweisung
SQL lernen: INNER JOIN vs LEFT JOIN
SQL lernen: SQL-Skripte
SQL lernen: Arten von Beziehungen
SQL lernen: Mehrere Tabellen verbinden
SQL lernen: Aggregatfunktionen
SQL lernen: Wie schreibe ich eine komplexe SELECT-Abfrage?
SQL lernen: Die INFORMATION_SCHEMA-Datenbank
SQL lernen: SQL-Datentypen
SQL lernen: Theorie festlegen
SQL lernen: Benutzerdefinierte Funktionen
SQL lernen: Benutzerdefinierte gespeicherte Prozeduren
SQL lernen: SQL-Ansichten
SQL lernen: SQL-Trigger
SQL lernen: SQL-Abfragen üben
SQL lernen: SQL-Abfragebeispiele
SQL lernen: Erstellen Sie einen Bericht manuell mithilfe von SQL-Abfragen.
SQL lernen: SQL Server-Datums- und Uhrzeitfunktionen
SQL lernen: SQL Server-Berichte erstellen Verwenden von Datums- und Zeitfunktionen
SQL lernen: SQL Server-Pivot-Tabellen
SQL lernen: SQL Server-Export nach Excel
SQL lernen: Einführung in SQL Server-Schleifen
SQL lernen: SQL Server-Cursor
SQL lernen: SQL Best Practices zum Löschen und Aktualisieren von Daten
SQL lernen: Namenskonventionen
SQL lernen: SQL-bezogene Jobs
SQL lernen: Nicht-Equi-Joins in SQL Server
Lernen Sie SQL: SQL Injection
- Autor
- Letzte Beiträge
Seine bisherigen und gegenwärtigen Engagements reichen von Datenbankdesign und -codierung bis hin zu Lehren, Beraten und Schreiben über Datenbanken. Nicht zu vergessen, BI, Algorithmen erstellen, Schach, Philatelie, 2 Hunde, 2 Katzen, 1 Frau, 1 Baby …
Sie finden ihn auf LinkedIn
Alle Beiträge von Emil Drkusic anzeigen
- SQL lernen: SQL Injection – 2. November 2020
- SQL lernen: Non-Equi Joins in SQL Server – 29. September 2020
- SQL lernen: SQL-bezogene Jobs – 1. September 2020