MSSQLSERVER_2570

Gilt für:SQL Server

Details

attribute Wert
Produktname SQL Server
Ereignis-ID 2570
Ereignisquelle MSSQLSERVER
Komponente SQLEngine
Symbolischer Name DBCC_COLUMN_VALUE_OUT_OF_RANGE
Meldungstext Seite P_ID, Slot S_ID in Objekt-ID O_ID, Index-ID I_ID, Partitions-ID PN_ID, Zuordnungseinheits-ID A_ID (TYPE-Typ). Der Wert der COLUMN_NAME-Spalte liegt für den "DATATYPE"-Datentyp außerhalb des gültigen Bereichs. Aktualisieren Sie die Spalte auf einen gültigen Wert.

Erklärung

Der Spaltenwert, der in der angegebenen Spalte enthalten ist, liegt außerhalb des Bereichs möglicher Werte für den Spaltendatentyp. Wenn In einer Tabellenspalte ungültige Daten vorhanden sind, treten möglicherweise Probleme auf, je nachdem, welche Art von Vorgängen für die ungültigen Daten ausgeführt wurden. Es ist jedoch auch möglich, dass kein Problem auftritt, und die ungültigen Daten werden erst erkannt, wenn Sie einen oder DBCC CHECKTABLE einen DBCC CHECKDB Befehl ausführen.

Einige Symptome, die Sie aufgrund des Vorhandenseins ungültiger Daten bemerken können ( sind jedoch nicht beschränkt auf):

  • Zugriffsverletzungen oder andere Ausnahmen beim Ausführen von Abfragen für die betroffene Spalte.
  • Falsche Ergebnisse, die von Abfragen zurückgegeben werden, die für die betroffene Spalte ausgeführt werden.
  • Fehler oder Probleme, wenn Statistiken für die betroffene Spalte erstellt werden.
  • Fehlermeldungen wie die folgende:

    Msg 9100, Level 23, State 2, Line <Line LineNum> Mögliche Indexbeschädigung erkannt. Führen Sie DBCC CHECKDB aus.

DATA_PURITY Prüfungen

Wenn Sie einen DBCC CHECKDB - oder DBCC CHECKTABLE-Befehl ausführen, führt SQL Server "Datenreinheit" Überprüfungen von Spaltenwerten in jeder Zeile jeder Tabelle in der Datenbank durch. Diese Prüfungen werden ausgeführt, um sicherzustellen, dass die in den Spalten gespeicherten Werte gültig sind. Die Überprüfung stellt also sicher, dass die Werte nicht außerhalb des Gültigen Bereichs der Domäne liegen, die dem Datentyp der Spalten zugeordnet ist. Die Art der ausgeführten Überprüfung hängt vom Datentyp der Spalte ab. Die folgende nicht erschöpfende Liste enthält einige Beispiele:

Spaltendatentyp Typ der durchgeführten Datenüberprüfung
Unicode-Zeichen Die Datenlänge sollte ein Vielfaches von 2 sein.
Datetime Das Datumsfeld sollte zwischen dem 1. Januar 1753 und dem 31. Dezember 9999 sein. Das Zeitfeld muss vor "11:59:59.997PM" stehen.
Real und Float Überprüfen Sie, ob ungültige Gleitkommawerte wie SNAN, QNAN, NINF, ND, PD und PINF vorhanden sind.

Nicht alle Datentypen werden auf die Gültigkeit der Spaltendaten überprüft. Nur diejenigen, die möglicherweise einen außerhalb des Zulässigen gespeicherten Werts aufweisen, werden überprüft. Der Datentyp weist beispielsweise tinyint einen gültigen Bereich von 0 bis 255 auf und wird in einem einzelnen Byte gespeichert (der nur Werte zwischen 0 und 255 speichern kann), daher ist die Überprüfung des Werts nicht erforderlich.

Hinweis

Diese Prüfungen sind standardmäßig aktiviert und können nicht deaktiviert werden. Daher ist es nicht erforderlich, die Option DATA_PURITY explizit zu verwenden, wenn sie einen DBCC CHECKDB Oder DBCC CHECKTABLE Befehl ausführen. Wenn Sie jedoch die Option PHYSICAL_ONLY mit DBCC CHECKDB oder DBCC CHECKTABLEverwenden, werden Datenreinheitsprüfungen nicht durchgeführt.

problembericht DATA_PURITY

Wenn Sie einen oder DBCC CHECKTABLE einen DBCC CHECKDB Befehl mit aktivierter DATA_PURITY Option ausführen (oder die Datenreinheitsprüfungen automatisch ausgeführt werden), und ungültige Daten sind in den tabellen vorhanden, die von den DBCC Befehlen überprüft werden, enthält die DBCC Ausgabe weitere Meldungen, die auf die Probleme im Zusammenhang mit den Daten hinweisen. Die folgenden Beispielfehlermeldungen deuten auf Datenreeinheitsprobleme hin:

DBCC results for "account_history". 
Msg 2570, Level 16, State 2, Line <LineNum> 
Page (1:1073), slot 33 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "account_name" value is out of range for data type "nvarchar". Update column to a legal value. 
 
Msg 2570, Level 16, State 2, Line <LineNum> 
Page (1:1156), slot 120 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "account_name" value is out of range for data type "nvarchar". Update column to a legal value.
There are 153137 rows in 1080 pages for object "account_history". 
CHECKDB found 0 allocation errors and 338 consistency errors in table "account_history" (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 338 consistency errors in database '<DatabaseName>'. 
DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table1'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:154), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "real". Update column to a legal value. 
There are 4 rows in 2 pages for object "table1". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table1' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table2'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:155), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "decimal". Update column to a legal value. 
There are 4 rows in 1 pages for object "table2". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table2' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

DBCC results for 'table3'. 
Msg 2570, Level 16, State 3, Line <LineNum> 
Page (1:157), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "datetime". Update column to a legal value. 
There are 3 rows in 1 pages for object "table3". 
CHECKDB found 0 allocation errors and 1 consistency errors in table 'table3' (object ID <ObjectID>). 
CHECKDB found 0 allocation errors and 1 consistency errors in database 'realdata'. DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

For every row that contains an invalid column value, a 2570 error is generated. 

Ursache

Ungültige oder out-of-range-Daten wurden möglicherweise aus den folgenden Gründen in der SQL Server-Datenbank gespeichert:

  • Ungültige Daten wurden über RPC-Ereignisse (Remote Procedure Call) in SQL Server eingefügt.
  • Andere mögliche Ursachen für physische Datenbeschädigungen machten den Spaltenwert ungültig.

Beheben des Problems mit der Datenreinheit

Die Fehler von 2570 können nicht mithilfe einer der DBCC Reparaturoptionen repariert werden. Der Grund dafür ist, dass nicht bestimmt werden kann, DBCC welcher Wert verwendet werden soll, um den ungültigen Spaltenwert zu ersetzen. Daher muss der Spaltenwert manuell aktualisiert werden. Zum Ausführen einer manuellen Aktualisierung müssen Sie die Zeile finden, die das Problem hat. Verwenden Sie eine der folgenden Methoden, um die Zeile zu finden:

  • Führen Sie eine Abfrage für die Tabelle aus, die die ungültigen Werte enthält, um die Zeilen zu finden, die die ungültigen Werte enthalten.
  • Verwenden Sie die Informationen aus dem Fehler 2570, um die Zeilen mit ungültigen Werten zu identifizieren.

Beide Methoden sind in den folgenden Abschnitten detailliert beschrieben und enthalten Beispiele, um die Zeilen mit ungültigen Daten zu finden.

Sobald Sie die richtige Zeile gefunden haben, muss eine Entscheidung für den neuen Wert getroffen werden, der verwendet wird, um die vorhandenen ungültigen Daten zu ersetzen. Diese Entscheidung muss sehr sorgfältig getroffen werden, basierend auf dem Wertebereich, der für die Anwendung anwendbar ist, und der logischen Bedeutung dieser bestimmten Datenzeile. Hierzu stehen Ihnen folgende Optionen zur Verfügung:

  • Wenn Sie wissen, welcher Wert es sein soll, legen Sie ihn auf diesen bestimmten Wert fest.
  • Legen Sie ihn auf einen akzeptablen Standardwert fest.
  • Legen Sie den Spaltenwert auf NULL.
  • Legen Sie den Spaltenwert auf den Maximal- oder Minimalwert für diesen Datentyp der Spalte fest.
  • Wenn Sie der Meinung sind, dass die bestimmte Zeile nicht ohne einen gültigen Wert für die Spalte nützlich ist, löschen Sie diese Zeile vollständig.

Suchen von Zeilen mit ungültigen Werten mithilfe von T-SQL-Abfragen

Der Abfragetyp, den Sie ausführen müssen, um Zeilen zu finden, die ungültige Werte aufweisen, hängt vom Datentyp der Spalte ab, die ein Problem meldet. Wenn Sie sich die Fehlermeldung 2570 ansehen, werden Sie zwei wichtige Informationen feststellen, die Ihnen bei diesem Problem helfen können. Im folgenden Beispiel ist der Wert der Spalte account_name für den Datentyp nvarcharaußerhalb des Bereichs. Wir können die Spalte mit dem Problem und dem Datentyp der beteiligten Spalte leicht identifizieren. Sobald Sie den Datentyp und die involvierte Spalte kennen, können Sie Abfragen formulieren, um die Zeilen zu finden, die ungültige Werte für diese Spalte enthalten, und die Spalten auswählen, die zum Identifizieren dieser Zeile (als Prädikate in einer WHERE Klausel) für jede weitere Aktualisierung oder Löschung erforderlich sind.

Unicode-Datentyp
SELECT col1, DATALENGTH(account_name) AS Length, account_name  
FROM account_history 
WHERE DATALENGTH(account_name) % 2 != 0
Float-Datentyp

Führen Sie den folgenden Codeausschnitt aus, indem Sie zu Ihren tatsächlichen Primärschlüsselspalten, col2 zur Spalte aus dem Fehler 2570 und table1 zur Tabelle aus der CHECKDB Ausgabe wechselncol1.

SELECT col1, col2 FROM table1 
WHERE col2<>0.0 AND (col2 < 2.23E-308 OR col2 > 1.79E+308) AND (col2 < -1.79E+308 OR col2 > -2.23E-308)
Realer Datentyp

Führen Sie den folgenden Codeausschnitt aus, indem Sie zu Ihren tatsächlichen Primärschlüsselspalten, col2 zur Spalte aus dem Fehler 2570 und table1 zur Tabelle aus der CHECKDB Ausgabe wechselncol1.

SELECT col1, col2 FROM testReal  
WHERE col2<>0.0 AND (col2 < CONVERT(real,1.18E-38) OR col2 > CONVERT(real,3.40E+38)) AND (col2 < CONVERT(real,-3.40E+38) OR col2 > CONVERT(real,-1.18E-38))  
ORDER BY col1; -- checks for real out of range 
Dezimal- und numerische Datentypen
SELECT col1 FROM table2 
WHERE col2 > 9999999999.99999  
OR col1 < -9999999999.99999

Denken Sie daran, dass Sie die Werte basierend auf der Genauigkeit und Skalierung anpassen müssen, mit der Sie die decimal Oder-Spalte numeric definiert haben. Im obigen Beispiel wird die Spalte als col2 decimal(15,5)definiert.

Datetime-Datentyp

Sie müssen zwei verschiedene Abfragen ausführen, um die Zeilen zu identifizieren, die ungültige Werte für die datetime Spalte enthalten.

SELECT col1 FROM table3 
WHERE col2 < '1/1/1753 12:00:00 AM' OR col2 > '12/31/9999 11:59:59 PM' 

SELECT col1 FROM table3 WHERE 
((DATEPART(ms,col2)+ (1000*DATEPART(s,col2)) + (1000*60*DATEPART(mi,col2)) + (1000*60*60*DATEPART(hh,col2)))/(1000*0.00333))  > 25919999

Suchen von Zeilen mit ungültigen Werten mithilfe der physischen Position

Sie können diese Methode verwenden, wenn Sie die Zeilen mit ungültigen Werten nicht mithilfe der T-SQL-Methode finden können. In der Fehlermeldung 2570 wird die physische Position der Zeile, die den ungültigen Wert enthält, gedruckt. Sehen Sie sich beispielsweise die folgende Meldung an:

Page (1:157), slot 0 in object ID <ObjectID>, index ID 0, partition ID <PartitionID>, alloc unit ID <UnitID> (type "In-row data"). Column "col2" value is out of range for data type "datetime". Update column to a legal value. 

In dieser Nachricht bemerken Page (1:157), slot 0Sie . Es sind die Informationen, die Sie zum Identifizieren der Zeile benötigen. Das FileId ist , das PageInFile ist 1571, und das ist 0.SlotId

Sobald Sie diese Informationen haben, müssen Sie den folgenden Befehl ausführen:

DBCC TRACEON (3604)
DBCC PAGE (realdata , 1 , 157 , 3)

Hinweis

Mit diesem Befehl wird der gesamte Inhalt einer Seite gedruckt. Die Parameter für den DBCC PAGE Befehl lauten wie folgt:

  • Database name: Der Name der Datenbank.
  • File number: Die Dateinummer der Datenbankdatei.
  • Page number: Die Nummer der Seite, die Sie untersuchen möchten.
  • Print option: Ein optionaler Parameter, der die Ebene der Ausgabedetails bestimmt.

Nachdem Sie diesen Befehl ausgeführt haben, werden Sie eine Ausgabe sehen, die Informationen enthält, die dem folgenden Format ähneln:

Slot 0  Offset 0x60 Length 19
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x44D1C060
00000000: 10001000 01000000 ffffffff ffffffff †................
00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 0 Column 0  Offset 0x4 Length 4  col1 = 1
Slot 0 Column 1  Offset 0x8 Length 8  col2 = Dec 31 1899 19:04PM
Slot 1 Offset 0x73 Length 19
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x44D1C073
00000000: 10001000 02000000 0ba96301 f8970000 †..........c.....
00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 1 Column 0 Offset 0x4 Length 4 col1 = 2
Slot 1 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM
Slot 2 Offset 0x86 Length 19
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x44D1C086
00000000: 10001000 03000000 0ba96301 f8970000 †..........c.....
00000010: 0200fc†††††††††††††††††††††††††††††††... 
Slot 2 Column 0 Offset 0x4 Length 4 col1 = 3
Slot 2 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM

In dieser Ausgabe können Sie die Spaltenwerte für die Zeile von Interesse deutlich sehen. In diesem Fall benötigen Sie die Zeile, die auf slot 0 der Seite gespeichert ist. Aus der Fehlermeldung wissen Sie, dass col2 es sich um das Problem handelt. Sie können also den Wert col1 für Slot 0 die und die Verwendung als Prädikat in der WHERE Klausel Ihrer Update-Anweisung oder Lösch-Anweisung verwenden.

Warnung

Es wird empfohlen, die erste Methode zu verwenden (d. h. T-SQL-Abfragen verwenden, um die erforderlichen Informationen zu finden). Verwenden Sie den DBCC PAGE Befehl nur als letztes Mittel. Achten Sie darauf, wenn Sie diesen Befehl in einer Produktionsumgebung verwenden. Es wird empfohlen, die Produktionsdatenbank auf einem Testserver wiederherzustellen, alle erforderlichen Informationen mithilfe DBCC PAGEvon Informationen abzurufen und dann die Updates auf dem Produktionsserver auszuführen. Stellen Sie wie immer sicher, dass eine Sicherung für den Fall eines Fehlers bereit bleibt, und sie müssen zu einer früheren Kopie der Datenbank zurückkehren.

Siehe auch