Polyglot Notebooks: Eine praktische Einführung

Seite 2: Verbinden mit einer Microsoft-SQL-Server-Datenbank

Inhaltsverzeichnis

Die Beispieldaten in SQL liefert hier die AdventureWorks-Trainingsdatenbank von Microsoft, die sowohl auf dem eigenen SQL-Server als auch direkt als Azure SQL Database bereitgestellt werden kann. Eine Anleitung stellt Microsoft zur Verfügung.

Dabei ist zu beachten, dass im oben verwendeten Connection String Integrated Security=false gesetzt wurde, da das Beispiel die SQL Server Authentication nutzt. Sollte man Windows Authentication verwenden, ist das anzupassen.

Für die Nutzung von SQL ist als Erstes noch die Bibliothek Microsoft.DotNet.Interactive.SqlServer zu installieren. Da sie ein externes Paket ist, ist sie über die #r-Syntax zu referenzieren (siehe auch Referencing external assemblies):

// magic commands for SQL Server connection
#r "nuget: Microsoft.DotNet.Interactive.SqlServer, *-*"

Erst danach ist der SQL-Connection-String verwendbar, um einen Polyglot-SQL-Subkernel zu erstellen. Das geschieht mit dem Magic Command #!connect. Um die C#-Variable connectionString verwenden zu können, ist der Name des Subkernels anzugeben (hier @csharp, siehe nächstes Listing). Das Thema Variable Sharing folgt in den nächsten Abschnitten tiefergehender.

Im nächsten Schritt wird ein SQL-Subkernel mit dem SQL Connection String in einer C#-Zelle erstellt:

#!connect mssql --kernel-name DemoKernel @csharp:connectionString

Nutzende des Notebooks können nun entweder die Standard-productId verwenden oder sie abfragen lassen. So erfolgt das Festlegen der Standard-productId in einer SQL-Zelle:

-- use default productId
#!set --name productId --value "988"
Sie lässt sich wie folgt abfragen:
-- user defined productId
#!set --name productId --value @input:productId

Als nächstes muss die SQL-Query erstellt werden. Sie verbindet die beiden Tabellen SalesOrderHeader und SalesOrderDetail, um die Kundennummer (CustomderId) und Anzahl der gekauften Produkte pro Bestellung (OrderQty) zu erhalten. Durch das Speichern des Ergebnisses in einer Variable lässt es sich außerhalb der Query weiterverwenden. In diesem Beispiel (Listing 3) ist es die Variable QueryResult.

#!sql-DemoKernel --name QueryResult
SELECT CustomerID, SalesOrderHeader.SalesOrderID, ProductID, OrderQty
  FROM SalesLT.SalesOrderHeader JOIN SalesLT.SalesOrderDetail
          ON SalesLT.SalesOrderDetail.SalesOrderID = SalesLT.SalesOrderHeader.SalesOrderID
WHERE ProductID = @productId
ORDER BY OrderQty desc

Listing 3: Aufruf der SQL-Query aus Polyglot in einer SQL-Zelle

Direkt nach dem Ausführen der SQL-Zelle erscheint die Antwort im Notebook (siehe Abbildung 4).

Ausgabe des SQL-Befehls in Listing 3 (Abb. 4)

Nach dem Ausführen der SQL-Query soll die Ausgabe dazu dienen, eine Grafik zu generieren. Zunächst muss aber die Variable aus dem SQL-Subkernel in den C#-Subkernel geteilt werden. Hierfür verwendet Polyglot Notebooks das Konzept des Variable Sharing. Dadurch lassen sich Variablen zwischen fast allen unterstützten Sprachen und Technologien austauschen, außer Mermaid und HTML (siehe Tabelle 1).


Language

Variable sharing
C#
F#
PowerShell
JavaScript
SQL
KQL (Kusto Query Language)
Python
R
HTML
HTTP
Mermaid

Tabelle 1: Aktuell unterstützte Sprachen mit Vermerk, ob Variablenaustausch möglich ist

(Quelle: Microsoft)

In diesem Beispiel war es nötig, die Ausgabe der SQL-Query in einer Variablen QueryResult zu speichern (siehe erste Zeile in Listing 3). Andere Sprachen arbeiten nativ mit Variablen. Diese liegen in der Regel bereits im Arbeitsspeicher und lassen sich ohne zusätzlichen Befehl teilen. Welche Variablen in welchem Subkernel zu finden sind, lässt sich in der zuvor erwähnten Variablenansicht nachschlagen (siehe Abbildung 2).

In beiden Fällen lässt sich als Nächstes eine neue Zelle in einer anderen Sprache erstellen. Die Zelle beginnt mit dem Magic Command #!share, der als --from-Parameter die Information erhält, aus welchem Subkernel welche Variable in den aktuellen Subkernel geteilt werden soll. Das vorliegende Beispiel soll sowohl die Ausgabe der Query (QueryResult) als auch die Produkt-ID (productId) im C#-Subkernel nutzen. Nach Ausführung der folgenden Zelle stehen beide Werte als C#-Variablen zur Verfügung. Als Parameter werden der Quell-Subkernel und der Variablenname übergeben:

#!share --from sql-DemoKernel QueryResult
#!share --from sql-DemoKernel productId