Zum Inhalt springen

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.

 

Ankündigung: SQL Server Konferenz 2018 in Darmstadt

Vom 26.-28. Februar 2017 findet im Kongresscenter darmstadtium wieder die wichtigste und größte deutsche SQL Server Konferenz statt. Ich freue mich sehr, auch diesmal wieder mit einem eigenen Vortrag vertreten zu sein.
Die Konferenz selbst beginnt wie gewohnt mit einem Workshoptag, dem zwei Tage mit parallel stattfindenden Tracks zu verschiedenen Themen aus den Bereichen Business Intelligence, Information Management, Azure Data Platform, Administration, Development-Operations und Big Data folgen. Als Referenten sind ca. 50 Speaker aus dem In- und Ausland im Einsatz. Workshoptag und Hauptkonferenz sind auch separat buchbar.

Mein eigener Vortrag mit dem Titel „InMemory und Columnstore im Praxiseinsatz für OLTP-Systeme“ wird anhand von realen Projekterfahrungen darstellen, 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.

PASS2018_InlineRectangle_300x250_V1

Weitere Informationen zur Konferenz gibt es auf der offiziellen Veranstaltungswebsite: http://sqlkonferenz.de


Nachtrag: Mittlerweile ist die Konferenz vorbei. Wer an den Slides meiner Session interessiert ist, kann diese hier herunterladen: InMemoryColumnstoreOLTP_Panther

 

Ankündigung: IT-Tage 2017

SpeakerbuttonAuch in diesem Jahr werde ich wieder bei den Frankfurter IT-Tagen mit einem Vortrag vertreten sein. Unter der Überschrift Gutes SQL – schlechtes SQL (Tipps & Tricks aus 20 Jahren Erfahrung mit dem Microsoft SQL Server) werde ich anhand von zahlreichen Praxisbeispielen zeigen, wie man besser lesbaren, schnelleren, robusteren oder einfach besseren T-SQL Code schreibt.

Details zum Vortrag sowie der genauen Termin sind hier zu finden:
https://www.ittage.informatik-aktuell.de/programm/2017/gutes-sql-schlechtes-SQL/

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 2017 gibt es hier:
https://www.ittage.informatik-aktuell.de/programm/