Корпорация Майкрософт распространяет исправления Microsoft SQL Server 2008 в виде одного загружаемого файла. Поскольку исправления являются накопительными, каждый новый выпуск содержит все исправления и исправления для системы безопасности, которые были включены в предыдущий выпуск исправления SQL Server 2008.
Проблема
Рассмотрим следующий сценарий.
- В Microsoft SQL Server 2008 выполняется запрос, который использует функцию ISNULL() для выбора значений в столбце, допускающем значение NULL.
- Таблица, содержащая столбец, допускающий значение null, объединяется с другой таблицей в столбце, допускающем значение null.
- План запросов, создаваемый оптимизатором запросов, использует хэш-соединение, очередь печати или таблицу сортировки под оператором JOIN.
В этом случае появляется следующее сообщение об ошибке:
Примечание
MSG 681, уровень 16, состояние 3, строка 2
Попытка установить значение NULL столбца, не поддерживающего значение NULL.
Причина
Оптимизатор запросов определяет, что столбец, на который ссылается функция ISNULL(), не допускает значений NULL, поскольку оператор объединения отвергает значения NULL. Затем в плане запроса оптимизатор запросов помещает выражение в функции ISNULL() под оператор JOIN. Кроме того, значение выражения может быть NULL. Однако оптимизатор запросов не возвращает обратно свойство допустимости значений NULL для выражения. Затем в плане запроса рабочая таблица используется для реализации хэш-соединения, очередь печати или таблица сортировки, содержащая выражение. Кроме того, соответствующий столбец в рабочей таблице объявляется как не допускающий значений NULL. Когда обработчик запросов SQL Server пытается вставить значения NULL в рабочую таблицу, возникает ошибка.
Решение
Исправление для этой проблемы было впервые выпущено в накопительном пакете обновления 7 для SQL Server 2008 с пакетом обновления 1. Дополнительные сведения об этом накопительном пакете обновления см. в следующей статье базы знаний Майкрософт:
979065 Накопительный пакет обновления 7 для SQL Server 2008 с пакетом обновления 1 Примечание Поскольку сборки являются накопительными, каждый новый выпуск исправления содержит все исправления и исправления для системы безопасности, которые входили в предыдущий выпуск исправления SQL Server 2008 г. Рекомендуется рассмотреть возможность применения последнего выпуска исправления, содержащего это исправление. Для просмотра статьи в базе знаний Майкрософт щелкните следующий номер статьи:
970365 Сборки SQL Server 2008 г., выпущенные после выпуска SQL Server 2008 с пакетом обновления 1 (SP1)
Исправления для Microsoft SQL Server 2008 предназначены для определенных пакетов обновления для SQL Server. Необходимо установить исправление для SQL Server 2008 с пакетом обновления 1 (SP1) для установки SQL Server 2008 с пакетом обновления 1. По умолчанию все исправления, предоставляемые в пакете обновления для SQL Server, входят в следующий пакет обновления для SQL Server.
Временное решение
Обойти эту проблему можно одним из описанных ниже способов.
Способ 1
Удалите функцию ISNULL() из запроса.
Примечание. Поскольку столбец в этой функции является источником оператора JOIN, который отвергает значения NULL, функция ISNULL() является избыточной.
Способ 2
Перепишите запрос так, чтобы в плане запроса не использовалось хэш-соединение, очередь печати или таблица сортировки. Например, если запрос содержит предложение ORDER BY, создайте кластеризованный или охватывающий индекс, обеспечивающий требуемый порядок и включающий все обязательные столбцы. При использовании этого метода оптимизатор запросов не использует таблицу сортировки.
Состояние
Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».
Ссылки
Для получения сведений о модели добавочного обслуживания для SQL Server щелкните номер статьи со следующим номером в базе знаний Майкрософт:
935897 Команда SQL Server предоставляет модель добавочного обслуживания для предоставления исправлений для обнаруженных проблем
Дополнительные сведения о схеме именования для обновлений SQL Server см. в следующей статье базы знаний Майкрософт:
822499 Новая схема именования пакетов обновления программного обеспечения Microsoft SQL Server
Дополнительные сведения о терминологии обновления программного обеспечения см. в следующей статье базы знаний Майкрософт:
824684 Стандартные термины, используемые при описании обновлений программного обеспечения Майкрософт