KB2589980 - ИСПРАВЛЕНО: Неправильные результаты или нарушение ограничений при выполнении инструкции 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