Корпорация Майкрософт распространяет Microsoft SQL Server 2008 R2 с пакетом обновления 1 (SP1) и предоставляет один загружаемый файл. Поскольку исправления являются кумулятивными, каждый новый выпуск содержит все исправления и исправления для системы безопасности, которые были включены в более ранний выпуск SQL Server 2008 R2 с пакетом обновления 1 (SP1).
Проблемы
Рассмотрим следующий сценарий.
-
В таблице в Microsoft SQL Server 2008 R2 или Microsoft SQL Server 2012 имеется столбец типа данных DateTimeOffset .
-
Индекс создается в столбце DateTimeOffset .
-
Тип данных DateTimeOffset преобразуется в тип данных smalldatetime с помощью функции Cast или Convert без аргумента Style либо если значение аргумента стиля — 0.
-
Результат функции Cast или Convert используется в фильтре запроса Transact-SQL.
-
Вы запускаете запрос на языке Transact-SQL.
В этом сценарии результат, возвращенный запросом, является неверным, так как фильтр работает неправильно. Например, предположим, что столбец DateTimeOffset с именем "Дата" содержит следующие значения:
-
2011-05-21 23:00:00 -01:00
-
2011-05-21 23:00:00 +00:00
-
2011-05-21 23:00:00 +01:00
Вы запускаете следующий запрос:
SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'
Результат запроса возвращает только одну строку. Тем не менее ожидаемый результат должен возвращать строки для всех трех значений.
Решение
Сведения о накопительном пакете обновления
SQL Server 2012
Исправление для этой проблемы впервые выпущено в накопительном обновлении 3 для SQL Server 2012. Чтобы получить дополнительные сведения об этом накопительном пакете обновления, щелкните следующий номер статьи базы знаний Майкрософт:
2723749 Накопительный пакет обновления 3 для SQL Server 2012Примечание. Так как сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2012. Корпорация Microsoft рекомендует установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2692828 Сборки SQL Server 2012, выпущенные после выпуска SQL Server 2012 Вы должны применить исправление SQL Server 2012 к установке SQL Server 2012.
SQL Server 2008 R2 с пакетом обновления 2 (SP2)
Исправление для этой проблемы впервые выпущено в накопительном обновлении 1 для SQL Server 2008 R2 с пакетом обновления 2. Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления, щелкните следующий номер статьи базы знаний Майкрософт:
2720425 Накопительный пакет обновления 1 для SQL Server 2008 R2 с пакетом обновления 2 (SP2)Примечание. Поскольку сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008 R2. Рекомендуется установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2730301 Сборки SQL Server 2008 R2, выпущенные после выпуска SQL Server 2008 R2 с пакетом обновления 2 (SP2)
SQL Server 2008 R2 SP1
Исправление для этой проблемы впервые выпущено в накопительном обновлении 7. Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления для SQL Server 2008 R2 с пакетом обновления 1 (SP1), щелкните следующий номер статьи базы знаний Майкрософт:
2703282 Накопительный пакет обновления 7 для SQL Server 2008 R2 с пакетом обновления 1 (SP1)Примечание. Поскольку сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления системы безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008 R2 с пакетом обновления 1 (SP1). Рекомендуется установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2567616 Сборки SQL Server 2008 R2, выпущенные после выпуска сервера SQL Server 2008 R2 с пакетом обновления 1 (SP1)
Дополнительная информация
Чтобы воспроизвести неполадку, выполните указанные ниже действия.
-
Выполните следующий запрос, чтобы создать таблицу со столбцом DateTimeOffset и вставить некоторые записи.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
-
Выполните следующий запрос, и вы увидите, что все три значения указаны правильно в возвращенном результате.DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;
-
Выполните следующий запрос, чтобы создать индекс в столбце "DTO" и повторить тот же запрос: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
-
Снова запустите запрос на этапе 2. На этот раз запрос возвращает только одну строку.
-
Чтобы удалить индекс и созданную таблицу, выполните следующий запрос:DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; GO
Ссылки
Дополнительные сведения о функциях CAST и CONVERT можно найти на веб-сайте MSDN по следующему адресу:
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".