Inicial > SQL Server > Bug SQL Server 2008 RTM

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

clip_image001

SQL Server 2005 SP2

clip_image002

SQL Server 2008 RTM

clip_image003

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

Categorias:SQL Server
  1. Juliano
    5 de setembro de 2008 às 12:31

    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.

  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: