MSSQLSERVER_2570

Se aplica a:SQL Server

Detalles

Atributo Valor
Nombre del producto SQL Server
Id. de evento 2570
Origen de eventos MSSQLSERVER
Componente SQLEngine
Nombre simbólico DBCC_COLUMN_VALUE_OUT_OF_RANGE
Texto del mensaje Página P_ID, zona S_ID en el Id. de objeto O_ID, Id. de índice I_ID, Id. de partición PN_ID, Id. de unidad de asignación A_ID (tipo TYPE). El valor de la columna COLUMN_NAME está fuera del intervalo del tipo de datos "DATATYPE". Actualice la columna de forma que contenga un valor válido.

Explicación

El valor de columna contenido en la columna especificada está fuera del intervalo de valores posibles para el tipo de datos de columna. Si tiene datos no válidos en una columna de tabla, es posible que encuentre problemas, en función del tipo de operaciones realizadas con los datos no válidos. Sin embargo, también es posible que no aparezca ningún problema y los datos no válidos no se detectarán hasta que ejecute un DBCC CHECKDB comando o DBCC CHECKTABLE .

Algunos síntomas que puede observar debido a la presencia de datos no válidos incluyen (pero no están limitados a):

  • Infracciones de acceso u otras excepciones al ejecutar consultas en la columna afectada.
  • Resultados incorrectos devueltos por las consultas ejecutadas en la columna afectada.
  • Errores o problemas cuando se compilan estadísticas en la columna afectada.
  • Mensajes de error como el siguiente:

    Mensaje 9100, Nivel 23, Estado 2, LineNum <> Posibles daños en el índice detectados. Ejecute DBCC CHECKDB.

comprobaciones de DATA_PURITY

Al ejecutar un comando DBCC CHECKDB o DBCC CHECKTABLE , SQL Server realiza validaciones de "pureza de datos" de valores de columna en cada fila de cada tabla de la base de datos. Estas comprobaciones se realizan para asegurarse de que los valores almacenados en las columnas son válidos. Es decir, la validación garantiza que los valores no están fuera del intervalo del dominio asociado al tipo de datos de las columnas. La naturaleza de la validación realizada depende del tipo de datos de la columna. En la siguiente lista no exhaustiva se muestran algunos ejemplos:

Tipo de datos de columna Tipo de validación de datos realizada
carácter Unicode La longitud de los datos debe ser un múltiplo de 2.
Datetime El campo de fecha debe estar comprendido entre el 1 de enero de 1753 y el 31 de diciembre de 9999. El campo de hora debe ser anterior a "11:59:59.997PM".
Real y Float Compruebe la existencia de valores de punto flotante no válidos como SNAN, QNAN, NINF, ND, PD y PINF.

No todos los tipos de datos se comprueban para comprobar la validez de los datos de columna. Solo se comprueban las que pueden tener un valor almacenado fuera del intervalo. Por ejemplo, el tinyint tipo de datos tiene un intervalo válido de 0 a 255 y se almacena en un solo byte (que solo puede almacenar valores entre 0 y 255), por lo que no es necesario comprobar el valor.

Nota

Estas comprobaciones están habilitadas de forma predeterminada y no se pueden deshabilitar, por lo que no es necesario usar explícitamente la opción DATA_PURITY al ejecutar un DBCC CHECKDB comando o DBCC CHECKTABLE . Sin embargo, si usa la opción PHYSICAL_ONLY con DBCC CHECKDB o DBCC CHECKTABLE, no se realizan comprobaciones de pureza de datos.

informe de problemas de DATA_PURITY

Al ejecutar un DBCC CHECKDB comando o DBCC CHECKTABLE con la DATA_PURITY opción habilitada (o las comprobaciones de pureza de datos se ejecutan automáticamente) y existen datos no válidos en las tablas marcadas por los DBCC comandos, la DBCC salida incluirá otros mensajes que indican los problemas relacionados con los datos. Los siguientes mensajes de error de ejemplo indican problemas de pureza de datos:

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

Los datos no válidos o fuera del intervalo pueden haberse almacenado en la base de datos de SQL Server por los siguientes motivos:

  • Los datos no válidos se insertaron en SQL Server a través de eventos de llamada a procedimiento remoto (RPC).
  • Otras posibles causas de daños en los datos físicos hacen que el valor de columna no sea válido.

Corrección del problema de pureza de datos

Los errores 2570 no se pueden reparar mediante ninguna de las DBCC opciones de reparación. El motivo es que DBCC no se puede determinar qué valor se debe usar para reemplazar el valor de columna no válido. Por lo tanto, el valor de la columna se debe actualizar manualmente. Para realizar una actualización manual, debe encontrar la fila que tiene el problema. Use uno de los métodos siguientes para buscar la fila:

  • Ejecute una consulta en la tabla que contiene los valores no válidos para buscar las filas que contienen los valores no válidos.
  • Use la información del error 2570 para identificar las filas que tienen valores no válidos.

Ambos métodos se detallan en las secciones siguientes y proporcionan ejemplos para buscar las filas que tienen datos no válidos.

Una vez que encuentre la fila correcta, es necesario tomar una decisión sobre el nuevo valor que se usará para reemplazar los datos no válidos existentes. Esta decisión se debe tomar con mucho cuidado, basándose en el intervalo de valores aplicables a la aplicación y el significado lógico de esa fila de datos concreta. Dispone de las siguientes opciones:

  • Si sabe qué valor debe ser, establézcalo en ese valor específico.
  • Establézcalo en un valor predeterminado aceptable.
  • Establezca el valor de columna en NULL.
  • Establezca el valor de columna en el valor máximo o mínimo de ese tipo de datos de la columna.
  • Si cree que la fila específica no es útil sin un valor válido para la columna, elimine esa fila por completo.

Búsqueda de filas con valores no válidos mediante consultas de T-SQL

El tipo de consulta que debe ejecutar para buscar filas que tengan valores no válidos depende del tipo de datos de la columna que notifica un problema. Si observa el mensaje de error 2570, observará dos partes importantes de información que pueden ayudarle con este problema. En el ejemplo siguiente, el valor de la columna account_name está fuera del intervalo para el tipo nvarcharde datos . Podemos identificar fácilmente la columna con el problema y el tipo de datos de la columna implicada. Por lo tanto, una vez que conozca el tipo de datos y la columna implicadas, puede formular consultas para buscar las filas que contienen valores no válidos para esa columna y seleccionar las columnas necesarias para identificar esa fila (como predicados en una WHERE cláusula) para cualquier actualización o eliminación posterior.

Tipo de datos Unicode
SELECT col1, DATALENGTH(account_name) AS Length, account_name  
FROM account_history 
WHERE DATALENGTH(account_name) % 2 != 0
Tipo de datos float

Ejecute el siguiente fragmento de código cambiando col1 a las columnas col2 de clave principal reales a la columna del error 2570 y table1 a la tabla de la CHECKDB salida.

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 de datos real

Ejecute el siguiente fragmento de código cambiando col1 a las columnas col2 de clave principal reales a la columna del error 2570 y table1 a la tabla de la CHECKDB salida.

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 
Tipos de datos decimales y numéricos
SELECT col1 FROM table2 
WHERE col2 > 9999999999.99999  
OR col1 < -9999999999.99999

Tenga en cuenta que debe ajustar los valores en función de la precisión y la escala con las que ha definido la decimal columna o numeric . En el ejemplo anterior, la columna se define como col2 decimal(15,5).

Tipo de datos Datetime

Debe ejecutar dos consultas diferentes para identificar las filas que contienen valores no válidos para la datetime columna.

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

Búsqueda de filas con valores no válidos mediante la ubicación física

Puede usar este método si no encuentra las filas con valores no válidos mediante el método T-SQL. En el mensaje de error 2570, se imprime la ubicación física de la fila que contiene el valor no válido. Por ejemplo, examine el mensaje siguiente:

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. 

En este mensaje, observará Page (1:157), slot 0. Es la información que necesita para identificar la fila. es , es PageInFile157y es SlotId0.1FileId

Una vez que tenga esta información, debe ejecutar el siguiente comando:

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

Nota

Este comando imprime todo el contenido de una página. Los parámetros del DBCC PAGE comando son:

  • Database name: nombre de la base de datos.
  • File number: número de archivo del archivo de base de datos.
  • Page number: número de la página que desea examinar.
  • Print option: parámetro opcional que determina el nivel de detalle de salida.

Una vez ejecutado este comando, observará una salida que contiene información similar al formato siguiente:

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

En esta salida, puede ver claramente los valores de columna de la fila de interés. En este caso, necesita la fila almacenada en slot 0 de la página. En el mensaje de error, sabe que col2 es el que tiene el problema. Por lo tanto, puede tomar el valor de col1 para Slot 0 y usarlo como predicado en la cláusula de la WHERE instrucción de actualización o la instrucción delete.

Advertencia

Se recomienda usar el primer método (es decir, usar consultas T-SQL para buscar la información necesaria). Use el DBCC PAGE comando solo como último recurso. Tenga todo cuidado al usar este comando en un entorno de producción. Se recomienda restaurar la base de datos de producción en un servidor de prueba, obtener toda la información necesaria mediante DBCC PAGEy, a continuación, realizar las actualizaciones en el servidor de producción. Como siempre, asegúrese de mantener una copia de seguridad lista en caso de que algo pase mal y tenga que revertir a una copia anterior de la base de datos.

Consulte también