MSSQLSERVER_2570
Aplica-se: SQL Server
Detalhes
Atributo | Valor |
---|---|
Nome do produto | SQL Server |
ID do evento | 2570 |
Origem do Evento | MSSQLSERVER |
Componente | SQLEngine |
Nome simbólico | DBCC_COLUMN_VALUE_OUT_OF_RANGE |
Texto da mensagem | Página P_ID, slot S_ID na ID de objeto O_ID, ID de índice I_ID, ID de partição PN_ID, ID de unidade de alocação A_ID (tipo TYPE). O valor de coluna COLUMN_NAME está fora do intervalo para tipo de dados "DATATYPE". Atualize a coluna para um valor válido. |
Explicação
O valor da coluna contido na coluna especificada está fora do intervalo de valores possíveis para o tipo de dados da coluna. Se você tiver dados inválidos em uma coluna da tabela, poderá encontrar problemas, dependendo do tipo de operações executadas nos dados inválidos. No entanto, também é possível que nenhum problema apareça e os dados inválidos não sejam descobertos até que você execute um DBCC CHECKDB
comando or DBCC CHECKTABLE
.
Alguns sintomas que você pode notar devido à presença de dados inválidos incluem (mas não estão limitados a):
- Violações de acesso ou outras exceções ao executar consultas na coluna afetada.
- Resultados incorretos retornados por consultas executadas na coluna afetada.
- Erros ou problemas quando as estatísticas estão sendo criadas na coluna afetada.
- Mensagens de erro como as seguintes:
Msg 9100, Nível 23, Estado 2, Linha <LineNum> Possível corrupção de índice detectada. Execute DBCC CHECKDB.
DATA_PURITY verificações
Quando você executa um comando DBCC CHECKDB ou DBCC CHECKTABLE , o SQL Server executa validações de "pureza de dados" de valores de coluna em cada linha de cada tabela no banco de dados. Essas verificações são executadas para garantir que os valores armazenados nas colunas sejam válidos. Ou seja, a validação garante que os valores não estejam fora do intervalo do domínio associado ao tipo de dados das colunas. A natureza da validação executada depende do tipo de dados da coluna. A lista não exaustiva a seguir dá alguns exemplos:
Tipo de dados da coluna | Tipo de validação de dados realizada |
---|---|
Caractere unicode | O comprimento dos dados deve ser um múltiplo de 2. |
Datetime | O campo de data deve estar entre 1º de janeiro de 1753 e 31 de dezembro de 9999. O campo de tempo deve ser anterior a "11:59:59.997PM". |
Real e Float | Verifique a existência de valores de ponto flutuante inválidos, como SNAN, QNAN, NINF, ND, PD e PINF. |
Nem todos os tipos de dados são verificados quanto à validade dos dados da coluna. Somente aqueles que podem ter um valor armazenado fora do intervalo são verificados. Por exemplo, o tinyint
tipo de dados tem um intervalo válido de 0 a 255 e é armazenado em um único byte (que só pode armazenar valores entre 0 e 255), portanto, não é necessário verificar o valor.
Observação
Essas verificações são habilitadas por padrão e não podem ser desabilitadas, portanto, não há necessidade de usar explicitamente a opção DATA_PURITY ao executar um DBCC CHECKDB
comando or DBCC CHECKTABLE
. No entanto, se você usar a opção PHYSICAL_ONLY com DBCC CHECKDB
ou DBCC CHECKTABLE
, as verificações de pureza de dados não serão executadas.
DATA_PURITY relatório de problemas
Quando você executa um DBCC CHECKDB
comando or DBCC CHECKTABLE
com a DATA_PURITY
opção habilitada (ou as verificações de pureza dos dados são executadas automaticamente) e existem dados inválidos nas tabelas verificadas pelos DBCC
comandos, a DBCC
saída incluirá outras mensagens que indicam os problemas relacionados aos dados. Os seguintes exemplos de mensagens de erro indicam problemas de pureza de dados:
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
Dados inválidos ou fora do intervalo podem ter sido armazenados no banco de dados do SQL Server pelos seguintes motivos:
- Dados inválidos foram inseridos no SQL Server por meio de eventos RPC (chamada de procedimento remoto).
- Outras causas potenciais de corrupção de dados físicos tornaram o valor da coluna inválido.
Corrigir o problema de pureza de dados
Os erros 2570 não podem ser reparados usando nenhuma das opções de DBCC
reparo. O motivo é que DBCC
não é possível determinar qual valor deve ser usado para substituir o valor da coluna inválida. Assim, o valor da coluna deve ser atualizado manualmente. Para executar uma atualização manual, você precisa encontrar a linha que apresenta o problema. Use um dos seguintes métodos para localizar a linha:
- Execute uma consulta na tabela que contém os valores inválidos para localizar as linhas que contêm os valores inválidos.
- Use as informações do erro 2570 para identificar as linhas que têm valores inválidos.
Ambos os métodos são detalhados nas seções a seguir e fornecem exemplos para localizar as linhas que têm dados inválidos.
Depois de encontrar a linha correta, é necessário tomar uma decisão sobre o novo valor que será usado para substituir os dados inválidos existentes. Essa decisão deve ser tomada com muito cuidado, com base no intervalo de valores aplicáveis ao aplicativo e no significado lógico dessa linha específica de dados. Você tem as seguintes opções:
- Se você souber qual valor deve ser, defina-o com esse valor específico.
- Defina-o como um valor padrão aceitável.
- Defina o valor da coluna como
NULL
. - Defina o valor da coluna como o valor máximo ou mínimo para esse tipo de dados da coluna.
- Se você acredita que a linha específica não é útil sem um valor válido para a coluna, exclua essa linha completamente.
Localizar linhas com valores inválidos usando consultas T-SQL
O tipo de consulta que você precisa executar para localizar linhas com valores inválidos depende do tipo de dados da coluna que relata um problema. Se você observar a mensagem de erro 2570, notará duas informações importantes que podem ajudá-lo com esse problema. No exemplo a seguir, o valor da coluna account_name
está fora do intervalo para o tipo nvarchar
de dados . Podemos identificar facilmente a coluna com o problema e o tipo de dados da coluna envolvida. Assim, depois de conhecer o tipo de dados e a coluna envolvida, você pode formular consultas para localizar as linhas que contêm valores inválidos para essa coluna e selecionar as colunas necessárias para identificar essa linha (como os predicados em uma WHERE
cláusula) para qualquer atualização ou exclusão adicional.
Tipo de dados Unicode
SELECT col1, DATALENGTH(account_name) AS Length, account_name
FROM account_history
WHERE DATALENGTH(account_name) % 2 != 0
Tipo de dados flutuante
Execute o snippet de código a seguir alterando col1
para as colunas de chave primária reais, col2
para a coluna do erro 2570 e table1
para a tabela da CHECKDB
saída.
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 dados reais
Execute o snippet de código a seguir alterando col1
para as colunas de chave primária reais, col2
para a coluna do erro 2570 e table1
para a tabela da CHECKDB
saída.
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 dados decimais e numéricos
SELECT col1 FROM table2
WHERE col2 > 9999999999.99999
OR col1 < -9999999999.99999
Lembre-se de que você precisa ajustar os valores com base na precisão e na escala com as quais definiu a decimal
coluna ou numeric
. No exemplo acima, a coluna é definida como col2 decimal(15,5)
.
Tipo de dados de data e hora
Você precisa executar duas consultas diferentes para identificar as linhas que contêm valores inválidos para a datetime
coluna.
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
Localizar linhas com valores inválidos usando o local físico
Você pode usar esse método se não conseguir encontrar as linhas com valores inválidos usando o método T-SQL. Na mensagem de erro 2570, o local físico da linha que contém o valor inválido é impresso. Por exemplo, veja a seguinte mensagem:
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.
Nesta mensagem, você percebe Page (1:157), slot 0
. São as informações de que você precisa para identificar a linha. O FileId
é 1
, o PageInFile
é 157
e o SlotId
é 0
.
Depois de ter essas informações, você precisa executar o seguinte comando:
DBCC TRACEON (3604)
DBCC PAGE (realdata , 1 , 157 , 3)
Observação
Este comando imprime todo o conteúdo de uma página. Os parâmetros para o DBCC PAGE
comando são:
Database name
: O nome do banco de dados.File number
: O número do arquivo do arquivo de banco de dados.Page number
: O número da página que você deseja examinar.Print option
: Um parâmetro opcional que determina o nível de detalhe de saída.
Depois de executar esse comando, você observará uma saída que contém informações semelhantes ao seguinte formato:
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
Nesta saída, você pode ver claramente os valores da coluna para a linha de interesse. Nesse caso, você precisa da linha armazenada na slot 0
página. A partir da mensagem de erro, você sabe que col2
é o único com o problema. Portanto, você pode pegar o valor de col1
for Slot 0
e usá-lo como o predicado na WHERE
cláusula de sua instrução update ou delete statement.
Aviso
Recomendamos que você use o primeiro método (ou seja, use consultas T-SQL para encontrar as informações necessárias). Use o DBCC PAGE
comando apenas como último recurso. Tome o máximo de cuidado ao usar esse comando em um ambiente de produção. É recomendável restaurar o banco de dados de produção em um servidor de teste, obter todas as informações necessárias usando DBCC PAGE
o e fazer as atualizações no servidor de produção. Como sempre, certifique-se de manter um backup pronto caso algo dê errado e você precise reverter para uma cópia anterior do banco de dados.