O PROBLEMA:
Alguns dias após a aplicação do FIX 949 (8.00.949 = SP3 / SP3a + KB #843267) fui contatado por alguns analistas onde relatavam que suas queries estavam tendo um comportamento estranho. As queries utilizavam uma variável do tipo DateTime na cláusula WHERE, faziam comparação com uma coluna do tipo smalldatetime e não estavam retornando nenhum registro, embora existissem registros na tabela. A observação era de que o problema não ocorria até alguns dias atrás.
Foram realizados vários testes e concluímos que o problema estava relacionado ao FIX 949 pois quando executávamos as queries em um ambiente com o FIX 818 (8.00.818 = SP3 / SP3a + KB #826161) o problema NÂO OCORRIA.
A QUERY:
Para tentar identificar o problema em seus ambientes, vocês podem utilizar o script abaixo.
— Identifica o build do SQL instalado
— Ex: Microsoft SQL Server 2000 – 8.00.972 (Intel X86)
Select @@version
Set NoCount On
— Coloque aqui um banco para criar as duas tabelas abaixo
Use [SeuBanco]
go
— Cria uma tabela com os campos DateTime e smalldatetime
Create Table TBData (
D_Small SmallDateTime,
D_Date DateTime,
Nome varchar(15)
)
— Cria uma tabela com o campo smalldatetime
Create Table TBNOME (
Nome Varchar(15),
D_Small smalldatetime
)
— Inseri registros na tabela
Insert Into TBData Values (‘2004-10-21′,’2004-10-21′,’AAA’)
Insert Into TBData Values (‘2004-10-21′,’2004-10-21′,’BBB’)
Insert Into TBData Values (‘2004-10-21′,’2004-10-21′,’CCC’)
Insert Into TBData Values (‘2004-10-21′,’2004-10-21′,’DDD’)
— Inseri registros na tabela
Insert Into TBNOME Values (‘AAA’,’2004-10-21′)
Insert Into TBNOME Values (‘BBB’,’2004-10-21′)
Insert Into TBNOME Values (‘CCC’,’2004-10-21′)
Insert Into TBNOME Values (‘DDD’,’2004-10-21′)
O problema está no SELECT abaixo!! Foi criada uma variável do tipo datetime e na cláusula WHERE está se fazendo um filtro em um campo smalldatetime usando-se uma variável do tipo datetime.
Print ‘Select COM variavel DATETIME’
Declare @D_Date datetime
Set @D_Date = ‘2004-10-21’
Select a.d_small, b.nome
from TBData a join TBNOME b
On a.D_Small = b.D_Small
Where a.D_Small = @D_Date —>>>> O Problema está aquí
GO
Resultado:
Select COM variavel DATETIME
d_small nome
————————— —————
(0 row(s) affected)
No SELECT abaixo a comparação está sendo feita com uma variável do tipo smalldatetime. Esta query retorna os resultados esperados.
Print ‘Select COM variavel SMALLDATETIME’
Declare @D_Date smalldatetime
Set @D_Date = ‘2004-10-21’
Select a.d_small, b.nome
from TBData a join TBNOME b
On a.D_Small = b.D_Small
Where a.D_Small = @D_Date
Resultado:
Select COM variavel SMALLDATETIME
d_small nome
———————– —————
2004-10-21 00:00:00 AAA
2004-10-21 00:00:00 AAA
2004-10-21 00:00:00 AAA
2004-10-21 00:00:00 AAA
2004-10-21 00:00:00 BBB
2004-10-21 00:00:00 BBB
2004-10-21 00:00:00 BBB
2004-10-21 00:00:00 BBB
2004-10-21 00:00:00 CCC
2004-10-21 00:00:00 CCC
2004-10-21 00:00:00 CCC
2004-10-21 00:00:00 CCC
2004-10-21 00:00:00 DDD
2004-10-21 00:00:00 DDD
2004-10-21 00:00:00 DDD
2004-10-21 00:00:00 DDD
(16 row(s) affected)
Obs: O problema só ocorre quando se faz JOINs entre tabelas!!
Em testes, descobrimos que no build 818 o resultado esperado é obtido, mas nos build 949 (8.00.949 = SP3 / SP3a + KB #843267), 967 e 972 (8.00.972 = SP3 / SP3a + KB #885290) o primeiro SELECT retorna 0 (zero) registros.
O ESPERADO É QUE AMBOS AS QUERIES RETORNEM A MESMA QUANTIDADE DE REGISTROS (16 reg).
A SOLUÇÃO
Como pudemos observar no segundo SELECT, para solucionar o problema basta você declarar a variável com o tipo smalldatetime.
O BUG:
Em chamado aberto com o suporte da Microsoft, o problema foi reproduzido e estará sendo registrado como um BUG. Sendo assim, ainda não existe nehuma documentação (KB) a respeito do problema.
A observação aqui é que se você possui alguma query que se enquadre no exemplo acima, verifique se a mesma está retornando o resultado esperado.
Caso você esteja tendo este mesmo problema em instalações do SQL Server com Builds diferentes dos citados acima ou tenha alguma dúvida, abra um tópico no fórum (com o mesmo nome deste artigo) para que possamos discutir o problema e quem sabe, identificar a partir de qual Build o problema passou a ocorrer.
Um abraço a todos
Nilton Pinheiro

