Advanced T-SQL: IF EXISTS mit MS SQL Server 2016

29. Juni 2016

Am 01.06.2016 war es endlich soweit, der MS SQL Server 2016 wurde endgültig der Allgemeinheit zur Verfügung gestellt. Version 13 des (vorwiegend) relationalen Datenbanksystems aus dem Hause Microsoft zeichnet sich durch zahlreiche neue Updates und Feature aus, welche dem Datenblatt zum Produkt entnommen werden können. Auch in die Abfrage-Sprache T-SQL (=Transact SQL) haben Neuerungen Einzug gehalten.

Vor einiger Zeit gab es eine kleine Artikelserie von mir, welche sich dem Thema “Advanced T-SQL” gewidmet hat. Bislang sind hierzu folgende Beiträge erschienen:

Im Rahmen des folgenden Flurfunkbeitrags soll nun das mit dem SQL-Server 2016 neu eingeführte “IF EXISTS”-Statement in Kombination mit DDL-Befehlen (=Data Definition Language) näher analysiert und vorgestellt werden.

Bedingte DDL-Befehle mit T-SQL bisher

Gegeben sei folgende Anforderung: Wenn ein Datenbankobjekt (z.B. eine Tabelle) existiert, so soll es gelöscht werden.

Einigen Datenbankentwickler dürfte dieses Beispielszenario sicherlich aus dem Arbeitsalltag bekannt sein. Wenn es nun darum geht dieses mit T-SQL-Mitteln umzusetzen, so wird häufig ein Pattern verwendet, welches sich in etwa an folgendem Code-Snippet orientiert:

   1: IF OBJECT_ID('[ObjectName]') IS NOT NULL

   2: BEGIN

   3:     DROP [OBJECT_TYPE] [ObjectName]

   4: END

Der Nachteil bei diesem Muster ist, dass zwei unabhängige T-SQL-Befehle – anfänglicher Existenz-Check mit anschließender DROP-Anweisung – notwendig sind, um den gewünschten Zielzustand auf der Datenbank zu erhalten. Insbesondere bei mehrfacher paralleler Ausführung kann es hierbei zu Fehlern kommen.

Das DIE-Statement (=DROP IF EXISTS) mit SQL-Server 2016

Im SQL-Server 2016 ist es nun möglich, das eben geschilderte Problem durch eine einzelne atomare T-SQL-Anweisung zu umgehen. Dieses orientiert sich bzgl. der T-SQL-Syntax an folgendem Code-Ausschnitt:

   1: DROP [OBJECT_TYPE] [IF EXISTS] [OBJECT_NAME]

 

Für eine konkrete Datenbanktabelle mit Namen ‘TestTable’ sieht das entsprechende Statement beispielsweise wie folgt aus:

   1: DROP TABLE IF EXISTS TestTable;

 

Sollte die Tabelle nicht existieren, so schlägt das DIE-Statement nicht fehl und mögliche folgende Befehle können einfach weiter ausgeführt werden. Das bringt wesentliche Vorteile und beugt Fehlern vor.

Das DIE-Pattern beschränkt sich nicht nur auf Tabellen, sondern kann auch auf andere Datenbankobjekte wie Views, Funktionen, Trigger, … angewendet werden. Eine komplette Liste aller möglichen Objekt-Typen wird im Internet, beispielsweise unter folgendem MSDN-Blog, aufgeführt.

Des Weiteren kann das DIE-Pattern auch mit ALTER-Statements kombiniert werden. Das bedingte Löschen einer Tabellenspalte kann mit folgendem T-SQL-Snippet erreicht werden:

   1: ALTER TABLE [TableName] DROP COLUMN IF EXISTS [ColumnName]

Entfernen eines möglicherweise existierenden Constraints erfolgt mittels dieses DROP-Statements:

   1: ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [ConstraintName]

Fazit:

In anderen Datenbank-Technologien ist es bereits länger möglich, bedingte DDL-Befehle mit einfacher Syntax abzusetzen. In Oracle kann dies für einige Datenbankobjekte mit Hilfe des “CREATE OR REPLACE”-Patterns, wie beispielsweise hier gezeigt, umgesetzt werden.

Mit der in diesem Artikel vorgestellten “IF EXISTS“-Syntax hat nun endlich auch die Microsoft-Datenbank-Technologie ihr eigenes Muster für einige optionale Datenstrukturbeschreibungen. Bei Datenbankentwicklern mit T-SQL dürfte es sich sicher bald einer großen Beliebtheit erfreuen. Es bleibt die (vermutlich unbeantwortete) Frage an Microsoft: Wieso hat es so lange gedauert 🙂 ?

Quellen:

  1. SQL Server – 2016 – T-SQL Enhancement “Drop if Exists” clause (letzter Zugriff: 2016-06-17)
  2. DROP IF EXISTS – new thing in SQL Server 2016 (letzter Zugriff: 2016-06-17)
  3. Microsoft macht SQL Server 2016 am 1. Juni allgemein verfügbar (letzter Zugriff: 2016-06-17)