14419 - Mensagem de erro ao executar a consistência de base (SQL Server)
Problema: Ao tentar executar uma consistência de base é exibida a mensagem Arithmetic overflow error for data type smallint, value = 60938.
Solução:
Solução:
Verificado que a situação ocorria pelo fato do objeto de banco sys.columns, referente a biblioteca de definições de dados, ter chegado ao seu limite de recriações de objetos no banco.
Essa biblioteca é exclusiva do SQLServer 2008 e é, como dito acima, responsável por controlar a quantidade de execuções e recriações de objetos no banco. Quando o limite é execedido, é exibida a mensagem.
Para verificar qual é a tabela que está causando este comportamento pode-se executar o script abaixo no banco de dados:
declare @id int
declare @colid int
deCLARE c1 CURSOR FOR
select id
from syscolumns c
inner join sys.tables t on c.id = t.object_id
declare @colid int
deCLARE c1 CURSOR FOR
select id
from syscolumns c
inner join sys.tables t on c.id = t.object_id
OPEN c1
FETCH NEXT FROM c1 INTO @id
FETCH NEXT FROM c1 INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
begin try
select @colid = colid
from sys.syscolumns s1
INNER JOIN sys.types t1 ON s1.xtype = t1.user_type_id
where s1.id = @id
end try
begin catch
select OBJECT_NAME(@id)
end catch
FETCH NEXT FROM c1 INTO @id
END
CLOSE c1
DEALLOCATE c1
BEGIN
begin try
select @colid = colid
from sys.syscolumns s1
INNER JOIN sys.types t1 ON s1.xtype = t1.user_type_id
where s1.id = @id
end try
begin catch
select OBJECT_NAME(@id)
end catch
FETCH NEXT FROM c1 INTO @id
END
CLOSE c1
DEALLOCATE c1
Ao executar o script serão exibida(s) a(s) tabela(s) que estão causando esta situação. Neste caso o DBA deve fazer um backup da tabela e renomea-la, dropar a original e restaurar o nome do backup para o nome original.
Esse procedimento, de recriação do objeto, faz com que o numero de sequencia de execução do sys.columns seja zerado e fazendo com que o erro não seja mais exibido.