Обновление не выполняется по причинам, сходным с теми, которые я объяснил в ответ на ваш предыдущий вопрос .
В этом случае, потому что вы потенциально обновление нескольких строк , где ключевой столбец из уникального индекса является изменен * , SQL Server создает план , который включает в себя Split, сортировке и оператор Collapse , чтобы избежать промежуточных уникальных нарушений основных (см этой статьи для более подробной информации) ,
Введенный таким образом оператор сортировки встречает промежуточную строку (включая внутренние издержки) шириной, превышающей предел, поэтому возникает ошибка. Добавление OPTION (ROBUST PLAN)
подсказки к запросу на обновление показывает, что это неизбежно:
Сообщение 8619, уровень 16, состояние 2, строка 681
Обработчику запросов не удалось создать план запроса, поскольку требуется рабочая таблица, а ее минимальный размер строки превышает максимально допустимый размер в 8060 байтов. Типичная причина, по которой требуется рабочая таблица, - это предложение GROUP BY или ORDER BY в запросе. Повторите ваш запрос без подсказки ROBUST PLAN.
Отношения источника и цели данных неясны для меня из краткого обзора, но если вы можете гарантировать, что каждая операция обновления повлияет не более чем на одну строку, вы можете избежать необходимости разделения / сортировки / свертывания, добавив TOP (1)
в оператор обновления:
UPDATE TOP (1) [TBL_BM_HSD_SUBJECT_AN_148_REPRO_TARGET]
SET ...
Это немного взломать, хотя. В идеале, структура оператора обновления и индексы должны предоставлять оптимизатору достаточно информации, чтобы он мог видеть, что будет обновлено не более одной строки. В частности, рекомендуется писать операторы обновления, которые являются детерминированными .
Учитывая странный дизайн и отсутствие ясности в вопросе, я даже не собираюсь пытаться расшифровать отношения данных или изменения запросов и индексов, которые были бы необходимы для достижения этого в деталях.
* Как отметил Мартин Смит в комментарии, это не было бы проблемой в данной конкретной ситуации, если бы таблица не была разделена. Если обновление устанавливает ключ в одно и то же детерминированное значение в каждой строке, Split / Sort / Collapse не требуется, если только таблица не разделена на этот ключ. Таким образом, альтернативное решение для этого запроса - не разбивать таблицу на время выборки .