Bug SQL Server 2008 RTM
Pois é tai um bug(ou não?) interessante do SQL Server 2008 RTM.
O Código abaixo roda no SQL 2000 e 2005 mas não roda no SQL 2008.
DECLARE @I Int
SET @I = -1
SELECT 1
WHERE CONVERT(Numeric(2,0),@i) = 0
Agora vamos dar uma olhada no plano de execução de cada versão.
SQL Server 2000 SP4
SQL Server 2005 SP2
SQL Server 2008 RTM
O que acontece é que o SQL Server 2008 converte(ummm interessante no SQL 2005 ele usou o CONVERT e no 2008 usou o CONVERT_IMPLICIT e no 2000 ele nem gerou o Compute Scalar) o valor de CONVERT(Numeric(2,0),@i) para um tinyint, sabemos o tinyint vai de 0 até 255 portanto quando ele tenta converter o -1 da erro.
Agora a pergunta que fica é, porque o SQL Server considerou o “0” como um tinyint?
Talvez por questões de performance já que ele só ocupa 1 byte.
Já foi aberto um comentário no Microsoft Connect para falar do assunto…
https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=363428&wa=wsignin1.0
Faz sentido que ele assuma um tipo que ocupe menos espaço, mas tinha que haver um teste pra ver se isto não vai gerar erros como o que você demonstrou.
Ótimo aviso.