Direkt zum Hauptinhalt

Einführung in SQL-Skripting in Databricks, Teil 2

Ein tiefer Einblick in die SQL Scripting-Konstrukte und deren Anwendung

SQL Scripting Deep Dive OG

Veröffentlicht: 19. Mai 2025

Produkt10 min Lesezeit

Summary

  • Einführung und Erklärung der SQL Scripting-Funktionen
  • Bedingte Ausführung und Steuerung des Ablaufs innerhalb von SQL-Skripten
  • Abfangen und Behandeln spezifischer Fehlerbedingungen

Im zweiten Teil der Blogreihe zur Ankündigung von SQL Scripting untersuchen wir die Verwaltungsaufgabe, die wir in Teil eins besprochen haben – wie man eine Groß-/Kleinschreibung ignorierende Regel auf jede STRING-Spalte in einer Tabelle anwendet. Wir gehen dieses Beispiel Schritt für Schritt durch, erklären die verwendeten Funktionen und erweitern es über eine einzelne Tabelle hinaus, um ein ganzes Schema abzudecken.

Sie können auch mitverfolgen in diesem Notebook

Ändern der Kollation aller Textfelder in allen Tabellen eines Schemas

Databricks unterstützt eine breite Palette sprachabhängiger, Groß-/Kleinschreibung ignorierender und Akzentzeichen ignorierender Kollationen. Es ist einfach, diese Funktion für neue Tabellen und Spalten zu verwenden. Aber was ist, wenn Sie ein bestehendes System haben, das überall upper() oder lower() in Prädikaten verwendet und die Leistungsverbesserungen nutzen möchte, die mit einer nativen, Groß-/Kleinschreibung ignorierenden Kollation verbunden sind, während Ihre Abfragen vereinfacht werden? Das erfordert etwas Programmierung; jetzt können Sie alles in SQL erledigen. 

Verwenden wir das folgende Testschema: 

Die Reihenfolge basiert auf den ASCII-Codepunkten, wobei alle Großbuchstaben allen Kleinbuchstaben vorangestellt sind. Können Sie das beheben, ohne upper() oder lower() hinzuzufügen?

Dynamische SQL-Anweisungen und Setzen von Variablen

Unser erster Schritt ist, der Tabelle mitzuteilen, dass sie ihre Standardkollation für neu hinzugefügte Spalten ändern soll. Sie können Ihre lokalen Variablen mit Parameter-Markern füttern, die das Notebook automatisch erkennt und Widgets hinzufügt. Sie können auch EXECUTE IMMEDIATE verwenden, um eine dynamisch zusammengestellte ALTER TABLE Anweisung auszuführen.

Jedes SQL-Skript besteht aus einer BEGIN .. END (compound) Anweisung. Lokale Variablen werden zuerst innerhalb einer compound Anweisung definiert, gefolgt von der Logik.

Dies ist alles nur eine Reihe von linearen Anweisungen. Bisher konnten Sie all dies mit SQL Session-Variablen ohne die compound Anweisung schreiben. Sie haben auch noch nicht viel erreicht. Schließlich wollten Sie die Kollation für vorhandene Spalten ändern. Dazu müssen Sie:

  • Alle vorhandenen String-Spalten in der Tabelle ermitteln
  • Die Kollation für jede Spalte ändern

Kurz gesagt, Sie müssen die INFORMATION_SCHEMA.COLUMNS Tabelle durchlaufen.

Schleifen

SQL Scripting bietet vier Möglichkeiten zum Schleifen und zur Steuerung von Schleifendurchläufen.

  1. LOOP … END LOOP;
    Dies ist eine "Endlosschleife".
    Diese Schleife wird fortgesetzt, bis eine Ausnahme oder ein expliziter ITERATE oder LEAVE Befehl die Schleife unterbricht.
    Wir werden die Ausnahmebehandlung später besprechen und auf die ITERATE- und LEAVE-Dokumentation verweisen, die erklärt, wie Schleifen gesteuert werden.
  2. WHILE predicate DO … END WHILE;
    Diese Schleife wird betreten und erneut durchlaufen, solange der Prädikatausdruck zu true ausgewertet wird oder die Schleife durch eine Ausnahme, ITERATE oder LEAVE unterbrochen wird.
  3. REPEAT … UNTIL predicate END REPEAT;
    Im Gegensatz zu WHILE wird diese Schleife mindestens einmal betreten und wiederholt ausgeführt, bis der Prädikatausdruck zu false ausgewertet wird oder die Schleife durch eine Ausnahme, LEAVE oder ITERATE unterbrochen wird.
  4. FOR query DO …. END FOR;
    Diese Schleife wird einmal pro Zeile ausgeführt, die die Abfrage zurückgibt, es sei denn, sie wird vorzeitig mit einer Ausnahme, LEAVE oder ITERATE verlassen.

Wenden Sie nun die FOR Schleife auf unser Kollationsskript an. Die Abfrage ruft die Spaltennamen aller String-Spalten der Tabelle ab. Der Schleifenkörper ändert nacheinander die Kollation jeder Spalte:


Lassen Sie uns überprüfen, ob die Tabelle korrekt aktualisiert wurde:

Bisher alles gut. Unser Code ist funktional vollständig, aber Sie sollten Delta anweisen, die von Ihnen geänderten Spalten zu analysieren, um vom File Skipping zu profitieren. Sie möchten dies nicht pro Spalte tun. Sammeln Sie sie stattdessen alle und erledigen Sie die Arbeit nur, wenn tatsächlich eine String-Spalte vorhanden war, für die die Kollation geändert wurde. Entscheidungen, Entscheidungen ... 

LEITFADEN

Ihr kompakter Leitfaden für moderne Analytics

Bedingte Logik

SQL Scripting bietet drei Möglichkeiten, SQL-Anweisungen bedingt auszuführen.

  1. If-then-else Logik. Die Syntax dafür ist unkompliziert:
    IF predicate THEN … ELSEIF predicate THEN … ELSE …. END IF;
    Natürlich können Sie beliebig viele optionale ELSEIF Blöcke haben, und das abschließende ELSE ist ebenfalls optional.
  2. Eine einfache CASE-Anweisung
    Diese Anweisung ist die SQL Scripting-Version des einfachen CASE-Ausdrucks.
    CASE expression WHEN option THEN … ELSE … END CASE;
    Eine einzelne Ausführung eines Ausdrucks wird mit mehreren Optionen verglichen, und die erste Übereinstimmung bestimmt, welche SQL-Anweisungen ausgeführt werden sollen. Wenn keine Übereinstimmung gefunden wird, wird der optionale ELSE-Block ausgeführt.
  3. Eine durchsuchte CASE-Anweisung
    Diese Anweisung ist die SQL Scripting-Version des durchsuchten CASE-Ausdrucks.
    CASE WHEN predicate THEN …. ELSE … END CASE;
    Der THEN-Block wird für das erste Prädikat ausgeführt, das zu true ausgewertet wird. Wenn keines zutrifft, wird der optionale ELSE-Block ausgeführt.

Für unser Kollationsskript reicht ein einfaches IF THEN END IF aus. Sie müssen auch die Menge der Spalten sammeln, auf die ANALYZE angewendet werden soll, und einige Funktionen höherer Ordnung verwenden, um die Spaltenliste zu erstellen:

Verschachtelung

Das, was Sie bisher geschrieben haben, funktioniert für einzelne Tabellen. Was ist, wenn Sie alle Tabellen in einem Schema bearbeiten möchten? SQL Scripting ist vollständig komponierbar. Sie können zusammengesetzte Anweisungen, bedingte Anweisungen und Schleifen innerhalb anderer SQL Scripting-Anweisungen verschachteln.

Was Sie hier tun werden, ist zweigeteilt:

  1. Fügen Sie eine äußere FOR Schleife hinzu, um alle Tabellen in einem Schema mithilfe von INFORMATION_SCHEMA.TABLES zu finden. Als Teil davon müssen Sie die Verweise auf die Tabellennamenvariable durch Verweise auf die Ergebnisse der FOR Schleifenabfrage ersetzen. 
  2. Fügen Sie eine verschachtelte zusammengesetzte Anweisung hinzu, um die Spaltenlistenvariable in die äußere FOR Schleife zu verschieben. Sie können keine Variable direkt im FOR Schleifenkörper deklarieren; er fügt keinen neuen Gültigkeitsbereich hinzu. Dies ist hauptsächlich eine Entscheidung, die sich auf den Programmierstil bezieht, aber Sie werden einen wichtigeren Grund für einen neuen Gültigkeitsbereich haben.

Dieser Fehler ist verständlich. Sie haben mehrere Möglichkeiten, fortzufahren:

  1. Filtern Sie nicht unterstützte Tabellentypen, wie z. B. Ansichten, in der information_schema-Abfrage heraus. Das Problem ist, dass es zahlreiche Tabellentypen gibt und gelegentlich neue hinzugefügt werden.
  2. Behandeln Sie Ansichten. Das ist eine großartige Idee. Nennen wir das Ihre Hausaufgabe.
  3. Tolerieren Sie die Fehlerbedingung

Ausnahmebehandlung

Eine Schlüsselkompetenz von SQL Scripting ist die Fähigkeit, Ausnahmen abzufangen und zu behandeln. Bedingungshandler werden im Deklarationsteil einer zusammengesetzten Anweisung definiert und gelten für jede Anweisung innerhalb dieser Zusammensetzung, einschließlich verschachtelter Anweisungen. Sie können bestimmte Fehlerbedingungen anhand des Namens, bestimmte SQLSTATEs, die mehrere Fehlerbedingungen behandeln, oder alle Fehlerbedingungen behandeln. Innerhalb des Körpers des Bedingungshandlers können Sie die Anweisung GET DIAGNOSTICS verwenden, um Informationen über die behandelte Ausnahme abzurufen und beliebige SQL-Skripte auszuführen, die Sie für angemessen halten, z. B. das Protokollieren des Fehlers in einem Log oder das Ausführen einer alternativen Logik zu der, die fehlgeschlagen ist. Sie können dann eine neue Fehlerbedingung SIGNAL, die ursprüngliche Bedingung RESIGNAL oder einfach die zusammengesetzte Anweisung, in der der Handler definiert ist, verlassen und mit der nächsten Anweisung fortfahren.

In unserem Skript möchten wir jede Anweisung überspringen, für die die Anweisung ALTER TABLE DEFAULT COLLATION nicht angewendet wurde, und den Namen des Objekts protokollieren.

Oben haben Sie ein administratives Skript rein in SQL entwickelt. Sie können auch ELT-Skripte schreiben und diese in Jobs umwandeln. SQL Scripting ist ein wirklich mächtiges Werkzeug, das Sie nutzen sollten.  

Als Nächstes

Ob Sie ein bestehender Databricks-Benutzer sind oder von einem anderen Produkt migrieren, SQL Scripting ist eine Funktion, die Sie nutzen sollten. SQL Scripting folgt dem ANSI-Standard und ist vollständig kompatibel mit OSS Apache Spark™. SQL Scripting wird im Detail in SQL Scripting | Databricks Documentation beschrieben. 

Sie können auch dieses Notebook verwenden, um sich selbst davon zu überzeugen. 

(Dieser Blogbeitrag wurde mit KI-gestützten Tools übersetzt.) Originalbeitrag

Verpassen Sie keinen Beitrag von Databricks

Abonnieren Sie unseren Blog und erhalten Sie die neuesten Beiträge direkt in Ihren Posteingang.