⚙️ SQL Server – QUOTED_IDENTIFIER & ANSI_NULLS
Zwei unscheinbare Schalter, die über Erfolg oder Misserfolg Ihrer gespeicherten Prozeduren entscheiden können. Die meisten SQL Server-Entwickler kennen QUOTED_IDENTIFIER und ANSI_NULLS nur vom Hörensagen – oder sie ignorieren sie völlig. Doch genau diese Einstellungen führen regelmäßig zu mysteriösen Fehlern: Geisterhafte Indexprobleme, falsche Vergleichsergebnisse mit NULL, oder der plötzliche Neustart von gespeicherten Prozeduren nach einer Migration. Dieser Artikel räumt mit den Mythen auf und zeigt, wie Sie diese Einstellungen sicher beherrschen.
🧩 Was steckt hinter QUOTED_IDENTIFIER?
Die Einstellung QUOTED_IDENTIFIER bestimmt, wie doppelte Anführungszeichen (" ") in SQL Server interpretiert werden.
- QUOTED_IDENTIFIER ON (empfohlen): Doppelte Anführungszeichen kennzeichnen Bezeichner (z. B. Tabellen- oder Spaltennamen). Einfache Anführungszeichen ' ' sind für Zeichenketten reserviert. Das ist ANSI-Standard.
- QUOTED_IDENTIFIER OFF: Doppelte Anführungszeichen verhalten sich wie einfache Anführungszeichen – sie definieren Zeichenkettenliterale. Das ist nicht standardkonform und wird aus Kompatibilitätsgründen zu älteren Systemen angeboten.
Warum ist das wichtig? Wenn Sie Leerzeichen oder reservierte Schlüsselwörter in Bezeichnern verwenden möchten (z. B. CREATE TABLE "Meine Tabelle"), müssen Sie QUOTED_IDENTIFIER ON setzen. Viele moderne Tools (SSMS, Azure Data Studio) schalten es standardmäßig ein. Dennoch gibt es Fallstricke.
🧩 ANSI_NULLS – Der Umgang mit NULL
ANSI_NULLS steuert das Vergleichsverhalten von = und <> mit NULL-Werten.
- ANSI_NULLS ON (Standard seit SQL Server 2005): Jeder Vergleich mit NULL ergibt UNKNOWN (weder TRUE noch FALSE). Also liefert WHERE Spalte = NULL keine Zeilen – Sie müssen IS NULL verwenden.
- ANSI_NULLS OFF (veraltet): WHERE Spalte = NULL würde tatsächlich Zeilen mit NULL zurückgeben. Das widerspricht dem SQL-Standard und führt zu inkonsistentem Code.
Microsoft hat ANSI_NULLS OFF bereits als deprecated markiert. In zukünftigen Versionen wird es nicht mehr unterstützt. Dennoch existieren unzählige alte Skripte, die darauf basieren.
⚠️ Die fatale Kombination: Beide Einstellungen bei Indizes und Funktionen
Die beiden Einstellungen werden bei der Erstellung einer gespeicherten Prozedur, Funktion oder eines Indexed Views „eingefroren“. Das bedeutet: Wenn Sie eine Prozedur mit QUOTED_IDENTIFIER OFF erstellen, bleibt dieser Wert für die Prozedur gespeichert – selbst wenn Sie später SET QUOTED_IDENTIFIER ON in der Session ausführen.
Besonders tückisch: Indexierte Sichten (Indexed Views) und Indizes auf berechneten Spalten verlangen zwingend QUOTED_IDENTIFIER ON und ANSI_NULLS ON zum Zeitpunkt der Erstellung und aller nachfolgenden Änderungen. Andernfalls schlägt die Indizierung fehl.
📊 Vergleichstabelle: Was passiert bei ON vs. OFF?
| Einstellung | ON (Standard, empfohlen) | OFF (veraltet / problematisch) |
|---|---|---|
| QUOTED_IDENTIFIER | "Bezeichner" für Tabellen/Spalten, 'Text' für Strings. Erlaubt reservierte Wörter als Bezeichner. | "Text" wird als Zeichenkette interpretiert, keine Unterscheidung mehr. Keine XML/JSON-Funktionen möglich. |
| ANSI_NULLS | NULL = NULL → UNKNOWN → kein Treffer. Erzwingt IS NULL. Standardkonform. | NULL = NULL → TRUE. Führt zu falscher Logik, deprecated. |
🔍 Praxistipp: So prüfen und korrigieren Sie bestehende Objekte
Mit folgenden Abfragen (auf Ihrer Beispiel-Datenbank, nennen wir sie ContosoSales) können Sie den Ist-Zustand ermitteln:
-- Gespeicherte Prozeduren mit abweichenden Einstellungen finden SELECT name, uses_ansi_nulls, uses_quoted_identifier FROM sys.sql_modules WHERE uses_ansi_nulls = 0 OR uses_quoted_identifier = 0; -- Skript zum Neuerstellen mit ON (Vorsicht: manuelle Migration nötig) -- Beispiel: Prozedur mit ON, ON neu generieren
Sie können die Einstellungen nicht nachträglich ändern – Sie müssen das Objekt löschen und neu erstellen (CREATE OR ALTER übernimmt die aktuellen Session-Einstellungen). Planen Sie daher einen kontrollierten Rollout.
✅ Fazit: Einfache Regeln für saubere T-SQL-Entwicklung
- ➤ Setzen Sie immer SET QUOTED_IDENTIFIER ON und SET ANSI_NULLS ON zu Beginn Ihrer Skripte.
- ➤ Verwenden Sie für Bezeichner mit Sonderzeichen eckige Klammern [Name mit Leerzeichen] – das ist unabhängig von der Einstellung.
- ➤ Prüfen Sie NULL immer mit IS NULL / IS NOT NULL, niemals mit = NULL.
- ➤ Bei der Erstellung von Indexed Views oder Indizes auf berechneten Spalten: Achten Sie doppelt auf ON, ON – sonst verweigert SQL Server den Index.
- ➤ Migrieren Sie veraltete Objekte (mit OFF) schrittweise, bevor Microsoft die Unterstützung endgültig entfernt.
Die beiden Schalter sind kein Hexenwerk – aber sie strafen Nachlässigkeit gnadenlos ab. Einmal verstanden, gehören überraschende NULL-Vergleiche und mysteriöse Index-Fehler der Vergangenheit an.