KB2589980 — FIX: неверные результаты или нарушение ограничения при запуске инструкции SELECT или DML, использующей функцию row_number и параллельный план выполнения в SQL Server 2008

Применимо к: SQL Server 2008

Корпорация Майкрософт распространяет исправления Microsoft SQL Server 2008 в один файл для загрузки. Поскольку исправления являются кумулятивными, каждый новый выпуск содержит все исправления и исправления для системы безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2008.

Проблемы


Рассмотрим следующий сценарий.
  • Вы запускаете параллельный запрос, использующий функцию ROW_NUMBER в Microsoft SQL Server 2008.
  • Вы пытаетесь выполнить запрос с помощью подзапроса, находящегося внутри инструкции SELECT или оператора языка обработки данных (DML).
В этом сценарии вы столкнулись с одной из указанных ниже проблем.
  • Если выполнить запрос внутри оператора SELECT , вы получите неверные результаты.
  • В таблице могут содержаться неверные данные, если запрос выполняется в инструкции DML. Если таблица содержит ограничения, инструкция может завершиться с нарушением ограничения. Например, если таблица имеет первичный ключ, при выполнении инструкции INSERT может возникнуть ошибка нарушения основного ключа.
Примечание. Эти проблемы могут возникать в одной из указанных ниже ситуаций.
  • Для параметра подсказок запроса MAXDOP задается значение больше 2.
  • Параметр « Максимальная степень параллелизма » задает значение, которое больше 2 в конфигурации сервера.

Решение


Чтобы устранить эту проблему, установите последнюю версию пакета обновления для SQL Server 2008. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
968382 Как получить последний пакет обновления для SQL Server 2008

Обходное решение


Чтобы обойти эту проблему, воспользуйтесь одним из описанных ниже методов.
  • Включите флаг трассировки 4134, если вы применили одно из указанных ниже обновлений.
    • Накопительный пакет обновления 6 для SQL Server 2008 или более поздний накопительный пакет обновления для SQL Server 2008
    • Накопительный пакет обновления 2 для SQL Server 2008 с пакетом обновления 1 (SP1) или более поздний накопительный пакет обновления для SQL Server 2008 SP1
    Дополнительные сведения о том, как включить флаги трассировки, можно найти на веб-сайте MSDN по следующему адресу:
  • Ссылка на раздел "временное решение" в статье 970198 базы знаний Майкрософт. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
    970198 Исправление: при выполнении запроса, использующего функцию row_number в SQL Server 2008, появляется неверный результат