Zeichenfolgen- oder Binärdaten würden abgeschnitten

Eigentlich kein DB-Problem, sondern ein Anwendungsproblem: In ein DB-Feld soll mehr Inhalt (Zeichen) eingefügt werden, als es durch die Felddefinition zulässig ist. Leider schweigt sich die Datenbank über weitere Details aus. Man erfährt also weder die betroffene Tabelle, noch das entsprechende SQL Statement oder was einem auch sonst bei der Fehlersuche helfen könnte.

Problem

create table test(dummy varchar(5));

insert into test (dummy) values ('12345');
--> Ok

insert into test (dummy) values ('123456');
--> Msg 8152, Level 16, State 30, Line 4
    String or binary data would be truncated.
    The statement has been terminated.

Wenn man das Statement händisch eingibt, kann man mit der Info noch etwas anfangen:

Problematisch wird es nun, wenn der Fehler untersucht werden soll, die Logs der Anwendung aber nicht das konkret fehlgeschlagene Statement enthalten. Dann weiß man nämlich nur, dass "irgendein Statement fehlgeschlagen ist, bei dem mehr Daten eingefügt werden sollen, als zulässig ist". Welche Tabelle oder gar Spalte / Inhalte betroffen sind, wird durch die Meldung nicht konkretisiert. 

Lösung / temporärer Workaround

Ab SQL Server 2019, 2017 CU12, 2016 SP2 CU6 gibt es die Möglichkeit, den Detailgrad der Fehlermeldung zu erhöhen (ist aber nicht als Standardoption aktiv). Nach der Aktivierung des Trace-Flags erhält man statt der o.g. Meldung den etwas aussagekräftigeren Fehler mit Hinweis auf die betroffene Tabelle, Spalte und Inhalt:

Msg 2628,
 Level 16,
 State 6,
 Procedure ProcedureName,
 Line Linenumber   
String or binary data would be truncated in table '%.*ls',
 column '%.*ls'. 
Truncated value: '%.*ls'. 
# Aktueller Status des Trace-Flags 460 auf dem DB-Server
DBCC TRACESTATUS(460)
--> 460 / 0 / 0 / 0

# Trace Flag 460 auf dem DB-Server aktivieren
DBCC TRACEON(460, -1);
DBCC TRACESTATUS(460)
--> 460 / 1 / 1 / 0

# Trace Flag 460 nach Fehlersuche wieder deaktivieren
# (SQL Server Standardverhalten wiederherstellen)
DBCC TRACEOFF(460, -1);
DBCC TRACESTATUS(460)
--> 460 / 0 / 0 / 0

Erweiterte Meldung / Trace-Flag 460 persistieren

MSSQL Startup Option Trace-Flag 460Das Ausführen von DBCC TRACEON(460, -1) aktiviert die erweiterte Fehlermeldung für alle DB-Sessions. Allerdings nicht für immer, sondern nur solange die Instanz nicht neu gestartet wird.

Möchte man die erweiterte Fehlermeldung dauerhaft verfügbar haben (über einen Neustart der SQL Server Instanz hinweg), muss das Trace-Flag als Startup-Parameter eingetragen werden. Am einfachsten macht man dies über den SQL Server Configuration Manager.

Dort kann man in den Instanzeigenschaften den zusätzlichen Startparameter ‑T460 angeben, wodurch das Trace-Flag beim Neustart der Instanz automatisch aktiviert wird.