Blog Article & Copyright by Lukas Hillesheim
Dieser Artikel zeigt, wie ein KQL Array in eine KQL Tabelle transformiert werden kann.
1. Problem
In KQL besteht manchmal eine syntaktische Herausforderung darin, eine Table Expression zu finden, die als Source für ein Query Statement dient, wobei die Source ein Array ist wie z.B. [a, b, c]. Als erfahrener BI-Entwickler wundert man sich, warum die KQL Engine ein Array nicht implizit als Sonderfall einer Tabelle betrachtet, so wie es analog in SQL und anderen Sprachen der Fall ist.
Eine SQL Server Tabelle könnte ein OOP-Entwickler im Allgemeinen als Iterable betrachten. Dabei würde der Zugriff auf eine einzelne Spalte eine Ausgabe bewirken, die entweder ein 1-dimensionales Array darstellt oder - mehr oder weniger austauschbar - als Sonderfall einer Tabelle. Aus dieser OOP-Sicht würde der Unterschied nur in der Dimensionalität von Array und Tabelle liegen.
Das Nachfolgende ist in der SQL Sprache möglich, nicht jedoch in KQL:
- select [letter] from [letters];
Die KQL Engine führt nicht implizit die Konvertierung eines Arrays in eine Tabelle durch. Daher kommt es zu einem Fehler, sobald das Array als Tabellen-Expression verwendet wird.
- dynamic(["a", "b", "c"])
Zum Zeitpunkt, als ich den Artikel geschrieben habe, existierte keine Built-In Funktion wie array_to_table, die eine solche Konvertierung durchführen könnte. Aber es ist durchaus möglich, eine eigene Implementierung der Konvertierung mit den Mitteln der KQL-Sprache zu schreiben. Der Artikel zeigt drei Ansätze: 1. eine Konvertierung explizit für einen gegebenen Fall bzw. für ein ganz bestimmtes Array, 2. eine dynamische Konvertierung, die das Array als Parameter behandelt, 3. eine Stored Function namens array_to_table, die als dauerhaft gespeichertes Datenbank-Objekt die Konvertierungs-Logik wiederverwendbar macht.
Lösung 1: AdHoc-Konvertierung eines Arrays
Im Beispiel existiert ein Array namens array1 mit drei Buchstaben. Mit der Hilfe des print-Operators wird das Array-Objekt als Table-Objekt zurückgegeben. Der Knackpunkt ist: in KQL ist der print-Operator nicht nur eine Art Debug-Command wie er in anderen Sprachen häufig auftaucht, sondern print gibt jedes Objekt als Tabelle zurück. In userem Beispiel enthält die Print-Ausgabe das Array als skalares Objekt. Das zurückgegebene Tabellen-Objekt besteht aus einer Spalte und einer Zeile. Oder mit anderen Worten: das Array befindet sich in einer Art Container. Mit dem mv-expand-Operator kann der Container entpackt werden. Zusätzlich erlaubt der Print-Operator auch, dem tabularen Ergebnis einen Spalten-Namen zu vergeben, in diesem Fall letter.
Lösung 2: Dynamische Konvertierung
In dieser Lösung wird ein Array als Parameter übergeben. Dadurch wird die Konvertierung dynamisch. Im Beispiel wird eine Liste von Integers konvertiert.
Lösung 3: Auslagern der Business Logik in eine Stored Function
In diesem Beispiel wird eine Stored Function erzeugt, die ein Argument von Typ dynamic erwartet. Die Function enthält den gleichen Code wie Lösung 2, bietet aber den zusätzlichen Vorteil, das sie als Datenbank-Objekt dauerhaft zur Verfügung steht und den Code wiederverwendbar macht.