Es wird berechtigterweise vorausgesetzt, dass geschriebener SQLScript Code korrekt funktioniert. Unter dieser Prämisse rücken die Lesbarkeit, Transparenz und Wartbarkeit als Qualitätskriterien in den Vordergrund, denn oft müssen existierende Programme nachträglich korrigiert bzw. erweitert werden. Die Gründe dafür können vielfältig sein: neue regulatorische Anforderungen, neue Wünsche der Benutzer oder schlicht Fehler in der Implementierung.
Damit alles reibungslos vonstattengeht, ist sauberer und gut lesbarer Code die Grundvoraussetzung. Guter SQL Code kann von einer dritten Person genauso einfach wie ein Buch gelesen werden. Dabei muss die Funktionsweise sowie der Grund für jeden Codeblock stets verständlich sein. Bei Bedarf muss auch ein Unbeteiligter schnell die jeweiligen Anpassungen vornehmen können.
Das gilt gleichermaßen für den ursprünglichen Entwickler. Denn auch bei eigenen Programmen kann es vorkommen, dass man sich nach einiger Zeit nicht mehr zurechtfindet. Mit einem verständlichen und gut strukturierten Code geht die Fehlersuche einfacher und schneller vonstatten. Was macht nun einen sauberen Code aus? In diesem Artikel geben wir Ihnen ein paar Anreize.
Formatierung
Einer der einfachsten Ansätze, den SQLScript Code lesbarer zu machen, ist eine geeignete Formatierung. Dabei sind vor allem Zeilenumbrüche, Leerzeilen, Einrückungen und Groß-/Kleinschreibung zu berücksichtigen.
Zeilenumbrüche
Technisch gesehen kann jede SQL-Abfrage in einer einzigen Zeile geschrieben werden. Viele Abfragen sind sehr lang und wären dadurch schwer lesbar. Daher sollten Sie größtenteils nur eine Zeile pro Feld und Bedingung verwenden. Zum Beispiel:
SELECT
CustomerName,
City
FROM
Customers
WHERE
Country='Germany';
Leerzeilen
Auch der richtige Einsatz von Leerzeilen kann die Lesbarkeit verbessern. Vermeiden Sie dabei Leerzeilen innerhalb einer Anweisung. Verwenden Sie stattdessen Leerzeilen, um die einzelnen Blöcke Ihres Programms, wie zum Beispiel Variablendeklaration, zu trennen.
DO BEGIN
lt_customers_in = SELECT
CustomerID
FROM
Customers
WHERE
Country = 'Germany';
lt_employees_in = SELECT
EmployeeID,
Amount
FROM
Orders
WHERE
CustomerID in (SELECT * FROM :lt_customers_in);
SELECT
EmployeeID,
SUM(Amount) AS Amount
FROM
:lt_employees_in
GROUP BY
EmployeeID
ORDER BY
Amount DESC;
END;
Einrückungen
Um Ihren Code noch lesbarer zu machen, rücken Sie nach einem SQL-Befehl die folgenden Felder und Bedingungen ein. Nutzen Sie die Einrückung auch für Unterabfragen.
Statt also komplett linksbündig zu arbeiten …
SELECT
CustomerName,
City
FROM
Customers;
… sollte Ihr Code so aussehen:
SELECT
CustomerName,
City
FROM
Customers;
Groß-/Kleinschreibung
Damit jeder Leser leicht erkennen kann, welche Operationen durchgeführt werden, sollten Sie alle SQL-Anweisungen groß schreiben.
Dazu zählen nicht nur Schlüsselwörter wie SELECT, FROM, WHERE, GROUP BY, ORDER BY, sondern auch andere Anweisungen, die innerhalb der Klauseln verwendet werden, wie: JOIN, AS, IN sowie ON. Auch Funktionen wie SUM() oder COUNT() sollten groß geschrieben werden, um sie besser von Spaltennamen zu unterscheiden.
Sprechende Namen
Verwenden Sie für Variablen sprechende (selbsterklärende) Namen. Der Sinn der Variable sollte sich bereits aus dem Namen erschließen. So sollte zum Beispiel die Variable für Familiennamen lv_familienname heißen, und nicht var1. Der Name von verwendeten Funktionen sollte ebenfalls direkt Aufschluss geben können, wofür diese Funktion benötigt wird. Entsprechend ergibt sich oft ein Nomen als Bezeichnung von Variablen und ein Verb für die Namen von Funktionen.
Steigern Sie die Leistung Ihres BW mit SQLScript!
Hier geht es zum Whitepaper!
Kommentare
Beim Lesen von Programmen helfen Entwicklerkommentare ungemein - vor allem in komplizierten Code-Blöcken. Allerdings gilt es auch bei Kommentaren nicht zu übertreiben. Zu viele Kommentare können den Lesefluss hindern. Nutzen Sie Kommentare nur dann, wenn es wirklich nötig ist. Wenn Sie sich an unsere Tipps halten, aussagekräftige Namen verwenden und modularen Code schreiben, sollten Sie Kommentare nur selten nutzen müssen.
So sind zum Beispiel folgende Kommentare völlig überflüssig:
/* Adressen für deutsche Kunden anzeigen */
SELECT
ContactName, --Name
Address, --Adresse
City, -- Stadt
PostalCode --PLZ
FROM
/* Tabelle mit Kundendaten */
Customers
WHERE
/* Selektionskriterien */
Country = 'Germany' --Nur Deutschland auswählen
Andererseits sind Kommentare nötig, wenn es aus dem Code selbst nicht ersichtlich ist, was Sie erreichen möchten. Als gute Faustregel gilt, dass Kommentare die Frage nach dem “Warum?” und nicht nach dem j“Was?” beantworten sollten. Abgesehen von Kommentaren im Code selbst, sind auch Kopfkommentare mit einer Erklärung der einzelnen Teilschritte des Gesamt-Codings und einigen Meta-Informationen hilfreich.
/*
Purpose: Lists salesmen that have registered more than 10 orders
Executed steps:
1.Format name
2.Enhance with respective team
Author: Sebastian Uhlig
Change History: Creation 14.12.2022
*/
Abfragen in mehrere Schritte zerlegen
Normalerweise wird ein SQL-Codeblock immer gleichzeitig ausgeführt. Indem Sie Ihr Coding in mehrere Schritte unterteilen, können Sie hinterher Fehlerursachen leichter finden. Durch die Trennung können Sie im Debugger einzelne Schritte analysieren und prüfen, ob das erwartete Ergebnis mit dem tatsächlichen Ergebnis übereinstimmt.
Dabei bietet sich die folgende Reihenfolge an:
- Eingangsselektionen
- Aggregationen
- Berechnungen
- Joins
- Ausgangsselektion
Übrigens, häufig wird ORDER BY in allen Schritten verwendet, ist jedoch nur in der Ausgangsselektion relevant. Indem Sie auf überflüssige Anweisungen verzichten, wird Ihr Code weniger überladen.
In SQLScript können Sie Tabellenvariablen zur Unterteilung nutzen. Dadurch können Sie einen großen, parallelen Codeblock in mehrere sequentielle Teilschritte unterteilen. Dies verbessert die Lesbarkeit ungemein.
Zum Beispiel:
DO BEGIN
-- Select german customers
lt_customers_in = SELECT
CustomerID
FROM
Customers
WHERE
Country = 'Germany';
-- Identify respective salesmen
lt_employees_in = SELECT
EmployeeID,
Amount
FROM
Orders
WHERE
CustomerID in (SELECT * FROM :lt_customers_in);
-- Show total sales per salesman in Germany
SELECT
EmployeeID,
SUM(Amount) AS Amount
FROM
:lt_employees_in
GROUP BY
EmployeeID
ORDER BY
Amount DESC;
END;
UDFs verwenden
Wie bereits erwähnt, hilft uns Modularisierung dabei, fehlerhafte Stellen im Code schneller zu finden. Neben der Trennung der Abfrage in mehrere Schritte, können Sie auch User Defined Functions (UDFs) verwenden.
Größere SELECT Anweisungen können in mehrere UDFs ausgelagert werden. Zum einen reduziert sich dadurch die Komplexität und die Lesbarkeit wird verbessert. Zum anderen können die Funktionen dadurch separat getestet werden. Ein weiterer Vorteil von UDFs ist die Wiederverwendbarkeit. So können Sie die Funktion einmal definieren und anschließend in mehreren Abfragen nutzen. Wenn Sie beispielsweise eine Verkettung von Namen und Vornamen durchführen möchten, könnten Sie folgendermaßen vorgehen:
SELECT
FirstName || ' ' || LastName AS Name
FROM
Customer;
Sie könnten jedoch auch eine UDF hierfür anlegen und diese in mehreren Abfragen wiederverwenden:
CREATE FUNCTION udf_concatenate_name(
lv_firstname NVARCHAR(30),
lv_lastname NVARCHAR(30)
)
RETURNS lv_name NVARCHAR(61)
AS BEGIN
lv_name = lv_firstname || ' ' || lv_lastname;
END;
SELECT
CustomerID,
udf_concatenate_name(FirstName, LastName) AS Name
FROM
Customer;
SQLScript Code - Unser Fazit
Nun haben Sie mehrere Ansätze kennengelernt, um Ihren SQLScript Code lesbarer zu machen und anschließende Wartung zu erleichtern. Denken Sie immer daran: guter SQL-Code ist nicht der, den Computer verstehen, sondern der, den Menschen verstehen.
Haben Sie Fragen zu SAP HANA SQLScript? Versuchen Sie das nötige Know-How in Ihrer Abteilung aufzubauen oder benötigen Sie Unterstützung bei einer konkreten Fragestellung? Wir helfen Ihnen gerne dabei. Fordern Sie noch heute ein unverbindliches Beratungsangebot an!
Weitere Informationen hierzu finden Sie im Buch "SQLScript für SAP HANA" (SAP PRESS, ISBN 978-3-8362-7408-1) von Jörg Brandeis.