SQL_Kurs

⚙️ SQL Server – QUOTED_IDENTIFIER & ANSI_NULLS

📅 13. Mai 2023 ⏱ Lesezeit: 7 Minuten 🏷️ SQL Server | T-SQL | Einstellungen

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.

❌ ANTI-PATTERN: QUOTED_IDENTIFIER OFF in gespeicherten Prozeduren Sie erstellen eine Prozedur mit SET QUOTED_IDENTIFIER OFF – vielleicht wegen einer alten Legacy-Anwendung. Später fügen Sie einen XML- oder JSON-Datentyp hinzu oder verwenden eine Table-Valued Function. Dann schlägt der Aufruf fehl, weil Funktionen wie FOR JSON oder Indexed Views zwingend QUOTED_IDENTIFIER ON erfordern. Die Fehlermeldung ist oft kryptisch, und die Prozedur lässt sich nicht mehr ändern, bis Sie die Einstellung korrigieren.
✅ BESSER: Immer ON verwenden – außer bei expliziter Legacy-Kompatibilität Setzen Sie in allen neuen Objekten QUOTED_IDENTIFIER ON. Vermeiden Sie Leerzeichen in Bezeichnern, dann funktioniert es problemlos. Nutzen Sie eckige Klammern [ ] für Bezeichner mit Sonderzeichen – die sind von dieser Einstellung unabhängig.

🧩 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.

❌ ANTI-PATTERN: Vergleiche mit NULL ohne IS NULL Viele Entwickler schreiben WHERE column = NULL in der Annahme, dass es funktioniert – oder sie kopieren Code aus Zeiten vor SQL Server 2005. Das Resultat: Die Bedingung greift nie, und Daten werden stillschweigend ignoriert. Schlimmer noch: Wenn die Prozedur mit ANSI_NULLS OFF erstellt wurde, verhält sie sich plötzlich anders, sobald Sie die Einstellung ändern.
✅ BESSER: Immer ON und konsequent IS NULL verwenden Erstellen Sie alle neuen Objekte mit ANSI_NULLS ON. Prüfen Sie bestehende Prozeduren auf = NULL oder <> NULL und ersetzen Sie diese durch IS NULL / IS NOT NULL. So vermeiden Sie Überraschungen bei Migrationen.

⚠️ 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.

📌 Merke: Die Einstellungen werden nicht „vererbt“. Eine Prozedur, die eine andere Prozedur aufruft, kann andere Einstellungen haben. Das führt zu undurchschaubarem Verhalten. Daher: Standardisieren Sie auf ON, ON.

📊 Vergleichstabelle: Was passiert bei ON vs. OFF?

EinstellungON (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_NULLSNULL = 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.


© 2026 SQL Server Deep Dive – QUOTED_IDENTIFIER & ANSI_NULLS. Keine externen Links, kein Tracking. Kopieren und teilen erlaubt.
Nächster SQL Server Deadlocks – Alle Fragen & Antworten
Cookies user preferences
We use cookies to ensure you to get the best experience on our website. If you decline the use of cookies, this website may not function as expected.
Accept all
Decline all
Analytics
Tools used to analyze the data to measure the effectiveness of a website and to understand how it works.
Google Analytics
Advertisement
If you accept, the ads on the page will be adapted to your preferences.
Google Ad
Save