Zum Inhalt springen

Data Blaster Community Conference (online und kostenfrei)

An Stelle des gewohnten SQL Saturdays Rheinland in Sankt Augustin veranstaltet die PASS in diesem Jahr am Vortag ein kostenfreie Online-Konferenz. Diese findet bereits morgen (19.06.2020) statt und läuft komplett über Microsoft Teams. Eine Anmeldung ist nicht erforderlich, man kann sich direkt über die Links in die einzelnen Sessions „einwählen“. Damit ist das Ganze auch gut nutzbar, wenn man vielleicht nur an einer oder zwei Sessions interessiert ist.

Insgesamt gibt es drei Tracks (DBA, Azure & Analytics), wobei es zum Start um 9 Uhr eine kurze Keynote für alle gibt. Ab 9:45 Uhr starten dann die ersten regulären Sessions, die letzten um 15:30 Uhr, wobei jede Session ca. 30 Minuten dauert.

Die Sessions werden alle aufgezeichnet und auf der PASS-Website veröffentlicht, so dass man sich diese auch im Nachgang anschauen kann.

Agenda und weitere Infos:
https://www.sqlpass.de/dbcc-die-data-blaster-community-conference

Konferenzvortrag zum Thema SQL Server Tools (insbesondere Azure Data Studio) online verfügbar

In den aktuellen Zeiten von Pandemie-bedingtem Home-Office oder in vielen Fällen leider auch Kurzarbeit sind Online-Trainings oder auch Aufzeichnungen von Konferenzvorträgen eine willkommene Möglichkeit, sich auch von zu Hause aus weiterzubilden.

Daher möchte ich an dieser Stelle auf meinen BASTA!-Vortrag aus dem Vorjahr zum Thema „Das neue SQL Azure Data Management Operations Studio“ hinweisen, der mittlerweile unter folgendem Link frei abrufbar ist:

https://youtu.be/9CRaJbCV1Hc

Darin geht es vorranging um das Azure Data Studio, sowie dessen Vor- und Nachteile gegenüber anderen SQL Server Verwaltungstools wie das SQL Server Management Studio und den SQL Server Data Tools.

 

SQL Server Konferenz in Darmstadt

Vom 3. bis 5. März findet im Kongresscenter Darmstadt („darmstadtium“) die SQL Server Konferenz statt, die von der SQL Server Community „PASS“ mit Unterstützung durch Microsoft veranstaltet wird. Dabei ist der erste Tag ein Workshop-Tag gefolgt von zwei Tagen Hauptkonferenz mit größtenteils einstündigen Sessions zu allen möglichen Themen rund um die Microsoft Data Platform.

Ich freue mich, in diesem Jahr wieder als Speaker dabei zu sein und dort meinen Vortrag mit dem Titel „Das neue „SQL Azure Data Management Operations Studio“ präsentieren zu dürfen.

Weitere Infos zur Konferenz gibt es auf der offiziellen Website: https://sqlkonferenz.de

SQLServer-Webbanner-Regular-Leaderboard-728x90

Artikel zum Azure Data Studio in der aktuellen Windows Developer

In der aktuellen Ausgabe der Zeitschrift Windows Developer (2/2020) ist ein Artikel von mir zum Thema „Azure Data Studio“ erschienen. Dabei wird beleuchtet, welche Möglichkeiten das Tool bietet und wie es sich von den bestehenden SQL Server Tools (SQL Server Management Studio, SQL Server Developer Tools) unterscheidet.

Siehe auch auf der Verlagswebsite:

https://kiosk.entwickler.de/windows-developer-magazin/windows-developer-magazin-2-2020-2/azure-data-studio-yet-another-sql-tool

 

Vortrag auf der BASTA! Spring 2020 in Frankfurt

Auch auf der kommenden Spring BASTA! bin ich wieder mit einem eigenen Vortrag vertreten (am Donnerstag, dem 27.02. von 16:45-17:45). Diesmal geht es um den Versuch einer ganzheitlichen Betrachtung eines Database Lifecycle Modells unter dem Titel „Osteopathie für Ihre Daten“. Neben dem eher methodischen Schwerpunkt werden auch einige Ansätze aufgezeigt, wie sich dies in einer SQL Server Umgebung umsetzen lässt.

Die BASTA! Spring mit dem Themenschwerpunkt „The Best of Best Practices!“ findet vom 24.-28. Februar im Frankfurt Marriott Hotel statt, wobei der erste und letzte Tag Workshoptage sind, während die anderen drei Tage klassische Konferenztage mit zahlreichen kürzeren Vorträgen sind.

Weitere Infos sind auf der Veranstaltungswebsite zu finden: https://basta.net

Neue Features für SQL vNext

Die neue Version SQL Server 2019 wird noch in diesem Jahr – voraussichtlich in diesem Sommer – erwartet. Während die wesentlichen Features für diese Version aufgrund der existierenden Community Technology Preview Versionen bereits bekannt sind, gibt es in gut informierten Kreisen wieder einmal einige Hinweise auf neue Features, die bislang noch geheim gehalten wurden. Dabei ist allerdings noch nicht klar, ob diese bereits in SQL 2019 oder einer späteren Version untergebracht werden.

Neuer Datentyp DATETIMEOFFSETCOUNTRY

Mittlerweile ist absehbar, dass innerhalb der EU die Unterscheidung von Sommer- und Winterzeit abgeschafft wird. Diskutiert wird allerdings derzeit noch, welche EU-Mitgliedsstaaten sich für die Sommerzeit und welche sich für die Winterzeit entscheiden.
Um dies auch datenbankseitig korrekt umsetzen zu können, wird analog zum bereits existierenden Datentyp DATETIMEOFFSET noch ein weiterer Datentyp mit Namen DATETIMEOFFSETCOUNTRY eingeführt, der neben der Zeitzone auch die länderspezifischen Gegebenheiten bzgl. Sommer- und Winterzeit berücksichtigt. Dabei werden die serverseitig konfigurierten Ländereinstellungen als Grundlage für die Berechnung genutzt. Passend dazu gibt es auch eine neue Systemfunktion SYSDATETIMECOUNTRY(), die aufgrund der Ländereinstellungen die Systemzeit inkl. Berücksichtigung der Sommer-/Winterzeit für das entsprechende Land zurückliefert. Wenn man die Systemzeit für ein anderes Land erhalten will, kann man der Funktion auch explizit ein Länderkürzel übergeben, wie das folgende Beispiel zeigt:
SELECT SYSDATETIMECOUNTRY(‚FR‘)

Alternativ lassen sich auch die neuen Systemfunktionen SYSDATETIMESUMMER() und SYSDATETIMEWINTER() nutzen, um das aktuelle Datum mit Uhrzeit explizit in Sommer- oder Winterzeit zu erhalten.

Neues Feature für Availability Groups: „SQLexxit“

Unter diesem Codenamen befindet sich derzeit ein Feature in Entwicklung, bei dem einzelne SQL Server selbst entscheiden können, aus einer Availability Group auszuscheiden. Dies ist jedoch keine Funktionalität die direkt online ausgeführt wird. Stattdessen befindet sich der ausscheidende Server eine längere Zeit in einem Zwischenzustand, der es ihm erlaubt, keine Ressourcen innerhalb der Availability Group zur Verfügung zu stellen, gleichzeitig aber trotzdem Daten von anderen Servern der Availability Group zu konsumieren. Dieser Zustand kann nur explizit durch einen Sysadmin mit der Funktion „Hard SQLexxit“ beendet werden, die dafür sorgt, dass der Server sofort aus der Availability Group genommen wird.


Die nächsten Monate werden sicherlich zeigen, ob die angesprochenen Features bereits in SQL Server 2019 umgesetzt werden, oder man sich noch etwas gedulden muss, bis diese genutzt werden können. Dabei bleibt jedoch stets ein Restrisiko, dass insbesondere das vielversprechende „SQLexxit“-Feature noch durch ein Referendum des entsprechenden Entwicklerteams gestoppt wird.

Ankündigung: IT-Tage 2018

Auch in diesem Jahr werde ich wieder bei den Frankfurter IT-Tagen mit einem Vortrag vertreten sein. Unter dem Titel „InMemory und Columnstore im Praxiseinsatz für OLTP-Systeme“ wird anhand von realen Projekterfahrungen dargestellt, mit welchen Stolpersteinen man bei der Einführung dieser Technologien im Einsatz für OLTP-Systeme rechnen muss und wie diese – sofern möglich – umgangen werden können. Dazu wird natürlich auch rückblickend der Nutzen betrachtet, den diese Technologien OLTP-Umfeld gebracht haben.

300_ITT18_Sprecher

Details zum Vortrag sowie der genauen Termin sind hier zu finden:
https://www.ittage.informatik-aktuell.de/programm/2018/ms-sql-server-inmemory-und-columnstore-im-praxiseinsatz-fuer-oltp-systeme/

Diese Session findet im Rahmen der IT-Tage, der Jahreskonferenz des Fachmagazins „Informatik Aktuell“ im Kongresshaus der Messe Frankfurt statt.

Das komplette Programm der IT-Tage 2018 gibt es hier:
https://www.ittage.informatik-aktuell.de/programm/

Neues Buch: Datenbankentwicklung lernen mit SQL Server 2017

Gestern ist bei O’Reilly die neue Auflage zu meinem Einsteigerbuch zur Datenbankentwicklung mit SQL Server erschienen, das nun auf SQL Server 2017 basiert. In dem Buch wird in 20 Kapiteln Schritt für Schritt in die Entwicklung von SQL Server Datenbanken eingeführt, wobei auch die grundlegenden Administrationsthemen wie beispielsweise Rechtevergabe und Sicherung/Wiederherstellung von Datenbanken nicht fehlen. Das Ganze wird am Beispiel von SQL Server 2017 Express gezeigt, ist jedoch auch ohne Änderung auf alle größeren Editionen von SQL Server anwendbar.

Im Vergleich zu letzten Version sind deben einer kompletten Überarbeitung aller Kapitel und Beispiele auch zwei komplett neue Kapitel hinzugekommen, in denen die Integration weiterer Programmiersprachen (R und Python) sowie das Thema Graphdatenbanken behandelt wird.

13170s

Robert Panther
Datenbankentwicklung lernen mit SQL Server 2017
Der praxisorientierte Grundkurs
O’Reilly
508 Seiten (Broschur)
ISBN: 978-3-96009-086-1
Preis: € 32,90 inkl. MwSt.

Weitere Infos:

 

Tipps & Tricks: Postleitzahl aus Adressfeld extrahieren

Gelegentlich steht man vor dem Problem aus einem großen Textfeld, das eine komplette Adresse enthält, einzelne Elemente, wie beispielsweise die Postleitzahl extrahieren zu müssen.

Eine mögliche Variante liegt natürlich darin, eine .NET-Funktion schreiben, die auf Basis eines regulären Ausdrucks den richtigen Bestandteil aus dem Adressfeld herausschneidet und diese über die .NET CLR-Integration in SQL Server einzubinden. Dies erfordert natürlich, dass die .NET CLR-Integration auf dem Server aktiviert ist, was in vielen Umgebungen aus Sicherheitsgründen nicht gegeben ist.

Eleganter wäre es ohnehin, eine Lösung zu finden, die komplett in T-SQL implementiert ist.
Hierfür möchte ich nun verschiedene Ansätze vorstellen, die jedoch alle ihre eigenen Vor- und Nachteile haben.

Der Einfachheit halber nutze ich als Quelle für die Adresse erstmal keine Tabelle, sondern eine Variable, in der eine komplette Adresse gespeichert ist:

DECLARE @Adresse AS nvarchar(800)
SET @Adresse = 'Michael Mustermann, Musterstrasse 12, 65432 Musterstadt'

Mit Hilfe der PATINDEX-Funktion lässt sich nun die erst Position finden, an der eine fünfstellige Zahl steht, die dann mit der SUBSTRING-Funktion aus der Variablen ausgeschnitten wird:

SELECT SUBSTRING(@Adresse,PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', @Adresse),5)

Dies bringt jedoch mehrere Nachteile mit sich:
1. Bei keiner fünfstelligen Zahl gibt die PATINDEX-Funktion den Wert 0 zurück, so dass die ersten fünf Zeichen der Adresse als PLZ interpretiert werden, auch wenn diese Buchstaben sind.
2. Bei mehreren mindestens fünfstelligen Zahlen (z.B. bei 5-stelliger Hausnummer) wird der erste Wert (also die Hausnummer) verwendet.
3. Bei einer Postleitzahl mit mehr als fünf Stellen werden die ersten fünf Stellen verwendet und der Rest ignoriert.

Das erste Problem lässt sich leicht durch eine Zusatzbedingung lösen:

DECLARE @Adresse AS nvarchar(800)
SET @Adresse = 'Michael Mustermann, Musterstrasse 12, 65 Musterstadt'

SELECT SUBSTRING(@Adresse,PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', @Adresse),5)
WHERE PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', @Adresse)>0

Ist nun keine fünfstellige Zahl in der Adresse enthalten, wird nun auch kein Ergebnis mehr zurückgeliefert.

Für das zweite Problem dreht man (unter der Annahme, dass die PLZ wahrscheinlich die letzte fünfstellige Zahl in der Adresse ist) die Zeichenreihenfolge in der Adresse einfach um, selektiert die erste fünfstellige Zahl und dreht in dieser die Ziffern wieder in die ursprüngliche Reihenfolge:

DECLARE @Adresse AS nvarchar(800)
SET @Adresse = 'Michael Mustermann, Musterstrasse 12345, 65432 Musterstadt'

SELECT REVERSE(SUBSTRING(REVERSE(@Adresse),PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', REVERSE(@Adresse)),5))
WHERE PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', @Adresse)>0

Bleibt noch das dritte Problem, das sich lösen lässt, wenn man in der Suchmusterzeichenfolge vor und nach den 5 numerischen Ziffern ein Leerzeichen einfügt, wodurch sich natürlich auch die Position um ein Zeichen (daher das zusätzliche „+1“) verschiebt.

DECLARE @Adresse AS nvarchar(800)
SET @Adresse = 'Michael Mustermann, Musterstrasse 12, 65432 Musterstadt'

SELECT REVERSE(SUBSTRING(REVERSE(@Adresse),PATINDEX('% [0-9][0-9][0-9][0-9][0-9] %', REVERSE(@Adresse))+1,5))
WHERE PATINDEX('% [0-9][0-9][0-9][0-9][0-9] %', @Adresse)>0

Dies setzt nun allerdings voraus, dass auch wirklich vor und nach der Postleitzahl ein Leerzeichen steht. Während man danach meist ein solches finden wird, kann davor auch direkt das Komma oder ein anderes Trennzeichen oder beispielsweise auch ein Länderkennzeichen gefolgt von einem Bindestrich stehen. Dies lässt sich lösen, indem man diese Sonderzeichen vorher per REPLACE durch ein Leerzeichen ersetzt.

DECLARE @Adresse AS nvarchar(800)
SET @Adresse = 'Michael Mustermann, Musterstrasse 12, D-65432 Musterstadt'

SELECT REVERSE(SUBSTRING(REVERSE(@Adresse),PATINDEX('% [0-9][0-9][0-9][0-9][0-9] %', REVERSE(REPLACE(REPLACE(REPLACE(@Adresse, ',', ' '), ';', ' '), '-', ' ')))+1,5))
WHERE PATINDEX('% [0-9][0-9][0-9][0-9][0-9] %', REPLACE(REPLACE(REPLACE(@Adresse, ',', ' '), ';', ' '), '-', ' '))>0

Ab SQL Server 2017 kann man statt der geschachtelten REPLACE-Aufrufe die TRANSLATE-Funktion verwenden, was die Abfrage wieder deutlich übersichtlicher macht:

DECLARE @Adresse AS nvarchar(800)
SET @Adresse = 'Michael Mustermann, Musterstrasse 12, D-65432 Musterstadt'

SELECT REVERSE(SUBSTRING(REVERSE(@Adresse),PATINDEX('% [0-9][0-9][0-9][0-9][0-9] %', REVERSE(TRANSLATE(@Adresse, ',;-', ' ')))+1,5))
WHERE PATINDEX('% [0-9][0-9][0-9][0-9][0-9] %', TRANSLATE(@Adresse, ',;-', ' '))>0

Ein anderer Ansatz das Problem zu lösen liegt darin, die Zeichenkette über die STRING_SPLIT-Funktion (ab SQL Server 2016 verfügbar) zuerst in einzelne Tokens zu zerlegen und anschließend das letzte Token zu suchen, das fünfstellig und numerisch ist. Damit die Zerlegung funktioniert, sollten jedoch auch hier vorher alle anderen Trennzeichen durch ein Leerzeichen ersetzt werden. Schauen wir uns zunächst die Zerlegung in einzelne Token an:

DECLARE @Adresse AS nvarchar(800)
SET @Adresse = 'Michael Mustermann, Musterstrasse 12, D-65432 Musterstadt'

SELECT value
FROM STRING_SPLIT(REPLACE(REPLACE(REPLACE(@Adresse, ';', ' '), '-', ' '), ',', ' '), ' ')

Ab SQL Server 2017:

SELECT value
FROM STRING_SPLIT(TRANSLATE(@Adresse, ',;-', ' '), ' ')

Durch eine Filterung auf Einträge die rein numerisch sind (ISNUMERIC(value)=1) und deren Länge 5 Zeichen beträgt, bleiben gültige Postleitzahlenkandidaten übrig. Wenn man nun per ORDER BY value DESC die Reihenfolge umdreht und dann den ersten Wert selektiert, hat man damit die letzte fünfstellige Ziffer in der ursprünglichen Zeichenfolge ermittelt:

SELECT TOP 1 value AS PLZ 
FROM STRING_SPLIT(REPLACE(REPLACE(REPLACE(@Adresse, ';', ' '), '-', ' '), ',', ' '), ' ')
WHERE ISNUMERIC(value)=1 AND LEN(RTRIM(value))=5
ORDER BY value DESC

Ab SQL Server 2017:

SELECT TOP 1 value AS PLZ 
FROM STRING_SPLIT(TRANSLATE(@Adresse, ',;-', ' '), ' ')
WHERE ISNUMERIC(value)=1 AND LEN(RTRIM(value))=5
ORDER BY value DESC

Eingebaut in eine Abfrage auf eine Tabelle namens Quelltabelle mit einer Spalte Adresse, in der die kompletten Adressen gespeichert sind, sieht dies dann wie folgt aus:

SELECT Adresse,
 (SELECT TOP 1 value AS PLZ 
 FROM STRING_SPLIT(TRANSLATE(@Adresse, ',;-', ' '), ' ')
 WHERE ISNUMERIC(value) = 1 AND LEN(RTRIM(value)) = 5
 ORDER BY value DESC) AS PLZ
FROM Quelltabelle

Oder für die weiter oben dargestellte Variante auf Basis der PATINDEX-Funktion:

SELECT Adresse,
 (SELECT REVERSE(SUBSTRING(REVERSE(Adresse),PATINDEX('% [0-9][0-9][0-9][0-9][0-9] %', REVERSE(TRANSLATE(Adresse, ',;-', ' ')))+1,5))
 WHERE PATINDEX('% [0-9][0-9][0-9][0-9][0-9] %', TRANSLATE(Adresse, ',;-', ' '))>0) AS PLZ
FROM Quelltabelle

Es gibt also verschiedene Varianten, das Problem zu lösen. Während die Variante mit STRING_SPLIT die elegantere mit besser lesbarem Code ist, ist diese Funktion erst ab SQL Server 2016 verfügbar. Die Variante mit PATINDEX funktioniert bereits ab SQL Server 2008 und dürfte sogar die etwas performantere sein, da darin nicht pro Datensatz eine Tokenliste aufgebaut werden muss. Da diese Operationen aber ohnehin im Hauptspeicher stattfinden, dürfte dies nicht allzu sehr ins Gewicht fallen.