MSSQLSERVER_2570

Aplica-se a: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, S_ID de slot no O_ID de ID do objeto, I_ID de ID de índice, PN_ID de ID de partição, A_ID de ID de unidade de alocação (tipo TYPE). O valor da coluna COLUMN_NAME está fora do intervalo para o tipo de dados "DATATYPE". Atualizar coluna para um valor legal.

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 de tabela, poderá encontrar problemas, dependendo do tipo de operações executadas em relação aos 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 a seguinte:

    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 de coluna Tipo de validação dos dados realizada
Caractere unicode O comprimento dos dados deve ser um múltiplo de 2.
Datetime O campo de data deve ser entre 1º de janeiro de 1753 e 31 de dezembro de 9999. O campo de hora 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 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 tinyint 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 ou com a opção habilitada (ou DBCC CHECKTABLE as verificações de pureza de dados são executadas automaticamente) e existem dados inválidos nas tabelas verificadas pelos DBCC comandos, a DATA_PURITYDBCC saída incluirá outras mensagens que indicam os problemas relacionados aos dados. As seguintes mensagens de erro de exemplo 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 de 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 de 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 DBCC opções de reparo. O motivo é que DBCC não é possível determinar qual valor deve ser usado para substituir o valor de coluna inválido. Assim, o valor da coluna deve ser atualizado manualmente. Para executar uma atualização manual, você precisa encontrar a linha que tem 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, uma decisão precisa ser tomada 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 ele deve ser, defina-o para 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ê olhar para a mensagem de erro 2570, você 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 facilmente identificar a coluna com o problema e o tipo de dados da coluna envolvida. Assim, depois de saber 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 trecho de código a seguir alterando col1 para a(s) coluna(s) de chave primária real(is), 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 real

Execute o trecho de código a seguir alterando col1 para a(s) coluna(s) de chave primária real(is), 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 você definiu a decimal coluna ou numeric . No exemplo acima, a coluna é definida como col2 decimal(15,5).

Tipo de dados datetime

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 localizar 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. É a informação que você precisa para identificar a linha. O FileId é, o é e o SlotIdPageInFile é 11570.

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 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 detalhes de saída.

Depois de executar esse comando, você notará 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

Nessa 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. Assim, você pode pegar o valor de for Slot 0 e usá-lo como predicado WHERE na cláusula de col1 sua instrução de atualização ou exclusão.

Aviso

Recomendamos que você use o primeiro método (ou seja, use consultas T-SQL para localizar 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