MSSQLSERVER_2570
Si applica a: SQL Server
Dettagli
Attributo | Valore |
---|---|
Nome prodotto | SQL Server |
ID evento | 2570 |
Origine evento | MSSQLSERVER |
Componente | SQLEngine |
Nome simbolico | DBCC_COLUMN_VALUE_OUT_OF_RANGE |
Testo del messaggio | Pagina P_ID, slot S_ID nell'oggetto con ID O_ID, ID di indice I_ID, ID di partizione PN_ID, ID di unità di allocazione A_ID (tipo TYPE). Il valore della colonna COLUMN_NAME non è compreso nell'intervallo consentito per il tipo di dati "DATATYPE". Aggiornare la colonna a un valore valido. |
Spiegazione
Il valore della colonna contenuto nella colonna specificata non è compreso nell'intervallo di valori possibili per il tipo di dati della colonna. Se si dispone di dati non validi in una colonna di tabella, è possibile che si verifichino problemi, a seconda del tipo di operazioni eseguite sui dati non validi. Tuttavia, è anche possibile che non venga visualizzato alcun problema e i dati non validi non verranno individuati fino a quando non si esegue un DBCC CHECKDB
comando o DBCC CHECKTABLE
.
Alcuni sintomi che si possono notare a causa della presenza di dati non validi includono (ma non sono limitati a):
- Violazioni di accesso o altre eccezioni durante l'esecuzione di query sulla colonna interessata.
- Risultati non corretti restituiti dalle query eseguite sulla colonna interessata.
- Errori o problemi durante la compilazione delle statistiche sulla colonna interessata.
- Messaggi di errore simili al seguente:
Msg 9100, Level 23, State 2, LineNum <> Possibile danneggiamento dell'indice. Eseguire DBCC CHECKDB.
DATA_PURITY controlli
Quando si esegue un comando DBCC CHECKDB o DBCC CHECKTABLE , SQL Server esegue le convalide di "purezza dei dati" dei valori di colonna in ogni riga di ogni tabella del database. Questi controlli vengono eseguiti per assicurarsi che i valori archiviati nelle colonne siano validi. Ovvero, la convalida garantisce che i valori non siano fuori intervallo del dominio associato al tipo di dati delle colonne. La natura della convalida eseguita dipende dal tipo di dati della colonna. L'elenco seguente non esaustivo fornisce alcuni esempi:
Tipo di dati colonna | Tipo di convalida dei dati eseguita |
---|---|
Carattere Unicode | La lunghezza dei dati deve essere un multiplo di 2. |
Datetime | Il campo data deve essere compreso tra il 1° gennaio 1753 e il 31 dicembre 9999. Il campo ora deve essere precedente a "11:59:59.997PM". |
Real e Float | Verificare l'esistenza di valori a virgola mobile non validi, ad esempio SNAN, QNAN, NINF, ND, PD e PINF. |
Non tutti i tipi di dati vengono controllati per la validità dei dati della colonna. Vengono controllate solo quelle che possono avere un valore archiviato non compreso nell'intervallo. Ad esempio, il tinyint
tipo di dati ha un intervallo valido compreso tra 0 e 255 e viene archiviato in un singolo byte (che può archiviare solo i valori compresi tra 0 e 255), quindi il controllo del valore non è necessario.
Nota
Questi controlli sono abilitati per impostazione predefinita e non possono essere disabilitati, quindi non è necessario usare in modo esplicito l'opzione DATA_PURITY durante l'esecuzione di un DBCC CHECKDB
comando o DBCC CHECKTABLE
. Tuttavia, se si usa l'opzione PHYSICAL_ONLY con DBCC CHECKDB
o DBCC CHECKTABLE
, i controlli di purezza dei dati non vengono eseguiti.
DATA_PURITY segnalazione dei problemi
Quando si esegue un DBCC CHECKDB
comando o DBCC CHECKTABLE
con l'opzione DATA_PURITY
abilitata (o i controlli di purezza dei dati vengono eseguiti automaticamente) e i dati non validi sono presenti nelle tabelle controllate dai DBCC
comandi, l'output DBCC
includerà altri messaggi che indicano i problemi relativi ai dati. I messaggi di errore di esempio seguenti indicano problemi di purezza dei dati:
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.
Causa
È possibile che i dati non validi o non compresi nell'intervallo siano stati archiviati nel database di SQL Server per i motivi seguenti:
- I dati non validi sono stati inseriti in SQL Server tramite eventi RPC (Remote Procedure Call).
- Altre possibili cause del danneggiamento dei dati fisici hanno reso non valido il valore della colonna.
Risolvere il problema di purezza dei dati
Gli errori 2570 non possono essere ripristinati usando alcuna delle opzioni di DBCC
ripristino. Il motivo è che DBCC
non è possibile determinare quale valore deve essere usato per sostituire il valore di colonna non valido. Di conseguenza, il valore della colonna deve essere aggiornato manualmente. Per eseguire un aggiornamento manuale, è necessario trovare la riga che presenta il problema. Utilizzare uno dei metodi seguenti per trovare la riga:
- Eseguire una query sulla tabella contenente i valori non validi per trovare le righe contenenti i valori non validi.
- Usare le informazioni dell'errore 2570 per identificare le righe con valori non validi.
Entrambi i metodi sono descritti in dettaglio nelle sezioni seguenti e forniscono esempi per trovare le righe con dati non validi.
Dopo aver trovato la riga corretta, è necessario prendere una decisione sul nuovo valore che verrà usato per sostituire i dati non validi esistenti. Questa decisione deve essere presa con molta attenzione, in base all'intervallo di valori applicabili all'applicazione e al significato logico di quella particolare riga di dati. Sono disponibili le seguenti opzioni:
- Se si conosce il valore che deve essere, impostarlo su tale valore specifico.
- Impostarlo su un valore predefinito accettabile.
- Impostare il valore della colonna su
NULL
. - Impostare il valore della colonna sul valore massimo o minimo per il tipo di dati della colonna.
- Se si ritiene che la riga specifica non sia utile senza un valore valido per la colonna, eliminare completamente tale riga.
Trovare righe con valori non validi usando query T-SQL
Il tipo di query da eseguire per trovare righe con valori non validi dipende dal tipo di dati della colonna che segnala un problema. Se si esamina il messaggio di errore 2570, si noteranno due importanti informazioni che consentono di risolvere questo problema. Nell'esempio seguente il valore della colonna account_name
non è compreso nell'intervallo per il tipo di nvarchar
dati . È possibile identificare facilmente la colonna con il problema e il tipo di dati della colonna coinvolta. Pertanto, una volta che si conoscono il tipo di dati e la colonna coinvolta, è possibile formulare query per trovare le righe che contengono valori non validi per tale colonna e selezionare le colonne necessarie per identificare tale riga (come predicati in una WHERE
clausola) per qualsiasi ulteriore aggiornamento o eliminazione.
Tipo di dati Unicode
SELECT col1, DATALENGTH(account_name) AS Length, account_name
FROM account_history
WHERE DATALENGTH(account_name) % 2 != 0
Tipo di dati float
Eseguire il frammento di codice seguente passando col1
alle colonne di chiave primaria effettive, col2
alla colonna dall'errore 2570 e table1
alla tabella dall'output CHECKDB
.
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)
Tipo di dati reale
Eseguire il frammento di codice seguente passando col1
alle colonne di chiave primaria effettive, col2
alla colonna dall'errore 2570 e table1
alla tabella dall'output CHECKDB
.
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
Tipi di dati decimali e numerici
SELECT col1 FROM table2
WHERE col2 > 9999999999.99999
OR col1 < -9999999999.99999
Tenere presente che è necessario modificare i valori in base alla precisione e alla scala con cui è stata definita la decimal
colonna o numeric
. Nell'esempio precedente la colonna è definita come col2 decimal(15,5)
.
Tipo di dati Datetime
È necessario eseguire due query diverse per identificare le righe che contengono valori non validi per la datetime
colonna.
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
Trovare righe con valori non validi usando la posizione fisica
È possibile usare questo metodo se non è possibile trovare le righe con valori non validi usando il metodo T-SQL. Nel messaggio di errore 2570 viene stampata la posizione fisica della riga contenente il valore non valido. Ad esempio, esaminare il messaggio seguente:
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 questo messaggio si noterà Page (1:157), slot 0
. Si tratta delle informazioni necessarie per identificare la riga. FileId
è , PageInFile
è 1
157
e è SlotId
0
.
Dopo aver ottenuto queste informazioni, è necessario eseguire il comando seguente:
DBCC TRACEON (3604)
DBCC PAGE (realdata , 1 , 157 , 3)
Nota
Questo comando stampa l'intero contenuto di una pagina. I parametri del DBCC PAGE
comando sono:
Database name
: nome del database.File number
: numero di file del file di database.Page number
: numero della pagina da esaminare.Print option
: parametro facoltativo che determina il livello di dettaglio dell'output.
Dopo aver eseguito questo comando, si noterà un output che contiene informazioni simili al formato seguente:
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 questo output è possibile visualizzare chiaramente i valori delle colonne per la riga di interesse. In questo caso, è necessaria la riga archiviata nella slot 0
pagina. Dal messaggio di errore si sa che col2
è quello con il problema. È quindi possibile accettare il valore di col1
per Slot 0
e usarlo come predicato nella clausola dell'istruzione WHERE
update o dell'istruzione delete.
Avviso
È consigliabile usare il primo metodo, ovvero usare le query T-SQL per trovare le informazioni necessarie. Usare il DBCC PAGE
comando solo come ultima risorsa. Prestare la massima attenzione quando si usa questo comando in un ambiente di produzione. È consigliabile ripristinare il database di produzione in un server di test, ottenere tutte le informazioni necessarie usando DBCC PAGE
e quindi eseguire gli aggiornamenti nel server di produzione. Come sempre, assicurarsi di mantenere pronto un backup nel caso in cui si sia verificato un problema ed è necessario ripristinare una copia precedente del database.