A Microsoft distribui as correções do Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) como um ficheiro transferível. Como as correções são cumulativas, cada nova versão contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior lançamento de correção do SqL Server 2008 R2 Service Pack 1 (SP1).
Sintomas
Considere o seguinte cenário:
-
Tem uma coluna do tipo datatimeoffset de dados numa tabela no Microsoft SQL Server 2008 R2 ou no Microsoft SQL Server 2012.
-
Cria-se um índice na coluna datatimeoffset.
-
Converter o tipo de dados de datatimeoff para um tipo de dados de data de pequena data utilizando a função CAST ou CONVERT sem o argumento de estilo, ou quando o valor do argumento de estilo é 0.
-
O resultado da função CAST ou CONVERT é utilizado num filtro numa consulta Transact-SQL.
-
Você dirige a consulta Transact-SQL.
Neste cenário, o resultado devolvido pela consulta é incorreto porque o filtro não funciona corretamente. Por exemplo, assuma que a coluna datatimeoffset que é denominada "Data" contém os seguintes valores:
-
2011-05-21 23:00:00 -01:00
-
2011-05-21 23:00:00 +00:00
-
2011-05-21 23:00:00 +01:00
Execute a seguinte consulta:
SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'
O resultado da consulta retorna apenas uma linha. No entanto, o resultado esperado deverá voltar a ser o resultado dos três valores.
Resolução
Informação de atualização cumulativa
SQL Server 2012
A correção para este problema foi lançada pela primeira vez na Cumulativa Update 3 para SQL Server 2012. Para obter mais informações sobre este pacote de atualização cumulativa, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:
2723749 Pacote de atualização cumulativo 3 para SQL Server 2012Nota Como as construções são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior lançamento de correção SQL Server 2012. A Microsoft recomenda que considere aplicar o mais recente lançamento de correção que contém este hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:
2692828 O SQL Server 2012 constrói que foram lançados após o lançamento do SQL Server 2012 Deve aplicar um hotfix SQL Server 2012 a uma instalação do SQL Server 2012.
Sql Server 2008 R2 Service Pack 2
A correção para este problema foi lançada pela primeira vez na Cumulativa Update 1 para SQL Server 2008 R2 Service Pack 2. Para obter mais informações sobre como obter este pacote de atualização cumulativa, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:
2720425 Pacote de atualização cumulativo 1 para SQL Server 2008 R2 Service Pack 2Nota Como as construções são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior lançamento de correção R2008 do SQL Server 2008. Recomendamos que considere aplicar o mais recente lançamento de correção que contém este hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:
2730301 O SQL Server 2008 R2 constrói que foram lançados após o lançamento do SQL Server 2008 R2 Service Pack 2
SQL Server 2008 R2 SP1
A correção para este problema foi lançada pela primeira vez na Atualização Cumulativa 7. Para obter mais informações sobre como obter este pacote de atualização cumulativa para o SQL Server 2008 R2 Service Pack 1, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:
2703282 Pacote de atualização cumulativo 7 para SQL Server 2008 R2 SP1Nota Como as construções são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior lançamento de correção do SqL Server 2008 R2 Service Pack 1. Recomendamos que considere aplicar o mais recente lançamento de correção que contém este hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:
2567616 O SQL Server 2008 R2 constrói que foram lançados após o lançamento do SQL Server 2008 R2 SP1
Mais Informações
Para reproduzir a questão, siga estes passos:
-
Executar a seguinte consulta de modo a criar uma tabela com uma coluna de datatimeoffset e inserir alguns registos:CREATE TABLE #TestTimeZones (dto datetimeoffset(0)); GO INSERT INTO #TestTimeZones(dto) VALUES ('2011-05-21 23:00:00 -01:00'), ('2011-05-21 23:00:00 +00:00'), ('2011-05-21 23:00:00 +01:00'); GO
-
Faça a seguinte consulta e poderá ver que os três valores estão corretamente listados no resultado devolvido:DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;
-
Executar a seguinte consulta de modo a criar um índice na coluna "dto" e repetir a mesma consulta:CREATE INDEX IX_testTimeZones_Dto ON #TestTimeZones(dto); GO -- Repeat the same query DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withIndex FROM #TestTimeZones WHERE CAST(dto A smalldatetime)=@t; GO
-
Executar a consulta no passo 2 novamente. Desta vez, a consulta retorna apenas uma linha.
-
Faça a seguinte consulta para eliminar o índice e a tabela que criou:DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; GO
Referências
Para obter mais informações sobre as funções CAST e CONVERT, aceda ao seguinte website da MSDN:
Informações gerais sobre as funções CAST e CONVERT no SQL Server
Estado
A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".