Partilhar via


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 nvarcharde 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 é 157e 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 PAGEo 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.

Confira também