L'aggiornamento fallisce per motivi sostanzialmente simili a quelli che ho spiegato in risposta alla tua domanda precedente .
In questo caso, poiché si sta potenzialmente aggiornando più righe in cui viene modificata una colonna chiave di un indice univoco * , SQL Server crea un piano che include gli operatori Dividi, Ordina e Comprimi per evitare violazioni intermedie della chiave univoca (vedere questo articolo per i dettagli) .
L'operatore di ordinamento così introdotto incontra una riga intermedia (comprese le spese generali interne) di una larghezza che supera il limite, quindi viene generato un errore. L'aggiunta di un OPTION (ROBUST PLAN)
suggerimento alla query di aggiornamento indica che ciò è inevitabile:
Messaggio 8619, livello 16, stato 2, riga 681
Il processore di query non è stato in grado di produrre un piano di query perché è richiesto un piano di lavoro e la sua dimensione minima della riga supera il massimo consentito di 8060 byte. Un motivo tipico per cui è richiesto un worktable è una clausola GROUP BY o ORDER BY nella query. Reinvia la tua richiesta senza il suggerimento PIANO ROBUSTO.
Le relazioni con i dati di origine / destinazione non mi sono chiare da una breve occhiata, ma se puoi garantire che ogni operazione di aggiornamento influirà al massimo su una riga, puoi evitare la necessità di dividere / ordinare / comprimere aggiungendo TOP (1)
all'istruzione di aggiornamento:
UPDATE TOP (1) [TBL_BM_HSD_SUBJECT_AN_148_REPRO_TARGET]
SET ...
Questo è un po 'un trucco, però. Idealmente, la costruzione dell'istruzione di aggiornamento e gli indici dovrebbero fornire informazioni sufficienti all'ottimizzatore in modo che possa vedere che verrà aggiornata al massimo una riga. In particolare, è consigliabile scrivere istruzioni di aggiornamento deterministiche .
Data la strana progettazione e la mancanza di chiarezza nella domanda, non ho nemmeno intenzione di provare a decifrare le relazioni dei dati, o le query e le modifiche dell'indice che sarebbero necessarie per raggiungere questo obiettivo in dettaglio.
* Come ha sottolineato Martin Smith in un commento, questo non sarebbe un problema in questa situazione particolare se la tabella non fosse partizionata. Laddove l'aggiornamento imposta la chiave sullo stesso valore deterministico in ogni riga, non è richiesto Dividi / Ordina / Comprimi, a meno che la tabella non sia anche partizionata su quella chiave. Pertanto, una soluzione alternativa per questa query è quella di non partizionare la tabella in sampletime .