SQL Server-Praxis

Wenn SQL Server in der Anwendung anders arbeitet

Vergleichen Sie Sitzungseinstellungen, Parametertypen und gespeicherte Moduloptionen, wenn SQL in Anwendung und SSMS unterschiedlich reagiert.

Eine Abfrage funktioniert in SSMS, scheitert oder stockt aber in der Anwendung. Das Kopieren des Textes reproduziert nicht die vollständige Anfrage. Die Verbindung besitzt Einstellungen, der Treiber überträgt Parametermetadaten, und eine Prozedur kann bei ihrer Erstellung gespeicherte Optionen tragen.

Zuerst die Interpretation vergleichen

Das Beispiel interpretiert dieselbe Datumszeichenfolge mit zwei DATEFORMAT-Werten. Das ursprüngliche Format wird gespeichert und danach wiederhergestellt.

DECLARE @OriginalFormat nvarchar(3);
SELECT @OriginalFormat = date_format
FROM sys.dm_exec_sessions WHERE session_id = @@SPID;

SET DATEFORMAT dmy;
SELECT TRY_CONVERT(date, '03/04/2023') AS InterpretedAsDMY;

SET DATEFORMAT mdy;
SELECT TRY_CONVERT(date, '03/04/2023') AS InterpretedAsMDY;

SET DATEFORMAT @OriginalFormat;

SELECT
    @@SPID AS SessionId,
    @@LANGUAGE AS SessionLanguage,
    @@DATEFIRST AS FirstDayOfWeek,
    @@LOCK_TIMEOUT AS LockTimeoutMs,
    SESSIONPROPERTY('ANSI_WARNINGS') AS AnsiWarnings,
    SESSIONPROPERTY('ARITHABORT') AS ArithAbort,
    SESSIONPROPERTY('QUOTED_IDENTIFIER') AS QuotedIdentifier;

DBCC USEROPTIONS;

Das erste Ergebnis ist der 3. April 2023, das zweite der 4. März 2023. Beide Konvertierungen gelingen. Eine Prüfung, die nur nach Fehlern sucht, übersieht daher die Abweichung. Ein gültiges, aber falsches Datum kann schwerer auffallen als ein Konvertierungsfehler.

Verwenden Sie für Anwendungseingaben typisierte Datumsparameter. Ist ein Textformat unvermeidbar, legen Sie eine eindeutige Darstellung und einen passenden ausdrücklichen Konvertierungsstil fest. Die Spracheinstellung des Entwicklers darf nicht zum Datenvertrag werden. DATEFIRST kann ebenfalls Wochentagsberechnungen verändern.

Führen Sie die Diagnose möglichst über die tatsächlich betroffene Anwendungsverbindung aus. Werte einer separaten Administratorsitzung beschreiben nicht die fehlerhafte Sitzung. Erfassen Sie zusätzlich Datenbank, Kompatibilitätsgrad, Isolation und Parametertypen. varchar und nvarchar mit gleichem sichtbaren Inhalt sind unterschiedliche Metadaten.

Laufzeit und gespeicherte Module trennen

Manche SET-Optionen wirken zur Laufzeit, andere bei der Analyse oder werden mit der Modulerstellung gespeichert. QUOTED_IDENTIFIER bestimmt die Bedeutung doppelt zitierter Texte. In sys.sql_modules können Sie unter anderem uses_quoted_identifier und uses_ansi_nulls der gespeicherten Prozedur prüfen.

Eine Änderung im Diagnosefenster schreibt solche Metadaten nicht automatisch um. Hat eine Migration das Modul unter unbeabsichtigten Einstellungen angelegt, korrigieren Sie das CREATE- oder ALTER-Skript gezielt und prüfen Sie anschließend die gespeicherten Werte. Verwenden Sie einfache Anführungszeichen für Zeichenketten und konsistente Regeln für Bezeichner.

Altes NULL-Verhalten ist kein moderner Ausweg. SQL Server 2017 und neuer verwendet immer ANSI_NULLS ON. Vergleiche mit NULL gehören in IS NULL oder IS NOT NULL. Ein historisches SET ANSI_NULLS OFF stellt keine verlässliche Grundlage für alte Anwendungsannahmen dar.

Auch Verbindungspooling verlangt Klarheit. Initialisierung und Rücksetzung hängen vom Provider ab. Der unterstützte Anwendungspfad muss die benötigten Einstellungen herstellen. Vermeiden Sie eine zufällige Abhängigkeit davon, dass eine frühere Anfrage die Sitzung passend vorbereitet hat.

Planunterschiede begründet untersuchen

Bestimmte SET-Optionen gehören zum Kontext des Plancaches. Unterschiedliche Kontexte können unterschiedliche Pläne für scheinbar gleiches SQL erzeugen. Daraus folgt nicht, dass ein Umschalten von ARITHABORT die richtige Optimierung ist. Kompilierungsparameter, Schätzungen und Zugriffswege können den eigentlichen Unterschied erklären.

Sichern Sie beide Pläne und vergleichen Sie Parametertypen, kompilierte Werte, Zeilenschätzungen und gemessene Zugriffe. Reproduzieren Sie typische Anwendungswerte im gleichen Kontext. Ein selektiver Kunde im interaktiven Test erklärt keine Produktionsanfrage für einen sehr großen Kunden.

Einige Indexfunktionen verlangen außerdem einen festgelegten Satz von Optionen. Gefilterte Indizes und Indizes auf berechneten Spalten haben Anforderungen unter anderem an ANSI_WARNINGS, QUOTED_IDENTIFIER und ARITHABORT sowie NUMERIC_ROUNDABORT OFF. Prüfen Sie den vollständigen dokumentierten Satz für die konkrete Funktion.

Transaktionsbezogene Einstellungen verdienen dieselbe Aufmerksamkeit. IMPLICIT_TRANSACTIONS kann Arbeit offenhalten, während LOCK_TIMEOUT nur das Warten auf Sperren begrenzt. Solche Unterschiede verändern Fehler- und Blockierungsverhalten auch ohne anderen Plan.

Verankern Sie notwendige Einstellungen abschließend in Initialisierung und Deployment und testen Sie beide Ausführungspfade. Bewahren Sie die erfassten Werte beim Vorfall auf. Damit wird die Anfrage reproduzierbar und der Vergleich mit SSMS liefert konkrete Hinweise statt nur eine widersprüchliche Beobachtung.

Technische Referenzen: Microsoft Learn: SET statements · Microsoft Learn: SET DATEFORMAT · Microsoft Learn: SET QUOTED_IDENTIFIER.

Frage zu diesem Artikel

Haben Sie eine Frage zu diesem Thema?

Beschreiben Sie, was Sie bewerten oder wo Sie nicht weiterkommen. Wir antworten mit einer praktischen Empfehlung.

Inquiries are not enabled in this preview.

Eine Frage zu diesem Artikel stellen