La actualización falla por razones muy similares a las que expliqué en respuesta a su pregunta anterior .
En este caso, debido a que potencialmente está actualizando varias filas donde se cambia una columna clave de un índice único * , SQL Server crea un plan que incluye operadores de división, clasificación y colapso para evitar violaciones de clave únicas intermedias (consulte este artículo para más detalles) .
El operador de clasificación así introducido encuentra una fila intermedia (incluidos los gastos generales internos) de un ancho que excede el límite, por lo que se genera un error. Agregar una OPTION (ROBUST PLAN)
pista a la consulta de actualización muestra que esto es inevitable:
Mensaje 8619, Nivel 16, Estado 2, Línea 681
El procesador de consultas no pudo generar un plan de consulta porque se requiere una mesa de trabajo y su tamaño mínimo de fila excede el máximo permitido de 8060 bytes. Una razón típica por la que se requiere una mesa de trabajo es una cláusula GROUP BY u ORDER BY en la consulta. Vuelva a enviar su consulta sin la sugerencia de ROBUST PLAN.
Las relaciones de datos de origen / destino no están claras para mí desde un breve vistazo, pero si puede garantizar que cada operación de actualización afectará a lo más una fila, puede evitar la necesidad de dividir / ordenar / contraer agregando TOP (1)
a la declaración de actualización:
UPDATE TOP (1) [TBL_BM_HSD_SUBJECT_AN_148_REPRO_TARGET]
SET ...
Sin embargo, esto es un poco hack. Idealmente, la construcción de la declaración de actualización y los índices deberían proporcionar suficiente información al optimizador para que pueda ver que, como máximo, se actualizará una fila. En particular, es una buena práctica escribir declaraciones de actualización que sean deterministas .
Dado el diseño extraño y la falta de claridad en la pregunta, ni siquiera voy a tratar de descifrar las relaciones de datos, o los cambios de consulta e índice que serían necesarios para lograr esto en detalle.
* Como Martin Smith señaló en un comentario, esto no sería un problema en esta situación particular si la tabla no estuviera particionada. Cuando la actualización establece la clave en el mismo valor determinista en cada fila, no es necesario dividir / ordenar / contraer, a menos que la tabla también esté particionada en esa clave. Entonces, una solución alternativa para esta consulta es no particionar la tabla en tiempo de muestreo .