La mise à jour échoue pour des raisons largement similaires à celles que j'ai expliquées en réponse à votre question précédente .
Dans ce cas, étant donné que vous mettez potentiellement à jour plusieurs lignes dans lesquelles une colonne clé d'un index unique est modifiée * , SQL Server crée un plan qui inclut les opérateurs Fractionner, Trier et Réduire pour éviter les violations intermédiaires de clé unique (consultez cet article pour plus de détails) .
L'opérateur de tri ainsi introduit rencontre une ligne intermédiaire (y compris les frais généraux internes) d'une largeur qui dépasse la limite, donc une erreur est générée. L'ajout d'un OPTION (ROBUST PLAN)
indice à la requête de mise à jour montre que cela est inévitable:
Msg 8619, niveau 16, état 2, ligne 681
Le processeur de requêtes n'a pas pu produire un plan de requête car une table de travail est requise et sa taille de ligne minimale dépasse le maximum autorisé de 8060 octets. Une raison typique pour laquelle une table de travail est requise est une clause GROUP BY ou ORDER BY dans la requête. Renvoyez votre requête sans le conseil ROBUST PLAN.
Les relations de données source / cible ne sont pas claires pour moi à partir d'un bref aperçu, mais si vous pouvez garantir que chaque opération de mise à jour affectera au plus une ligne, vous pouvez éviter la nécessité du fractionnement / tri / réduction en ajoutant TOP (1)
à l'instruction de mise à jour:
UPDATE TOP (1) [TBL_BM_HSD_SUBJECT_AN_148_REPRO_TARGET]
SET ...
C'est un peu un hack, cependant. Idéalement, la construction de l'instruction de mise à jour et les index doivent fournir suffisamment d'informations à l'optimiseur pour qu'il puisse voir qu'au plus une ligne sera mise à jour. En particulier, il est recommandé d'écrire des instructions de mise à jour qui sont déterministes .
Compte tenu de la conception étrange et du manque de clarté de la question, je ne vais même pas essayer de déchiffrer les relations entre les données, ou d'interroger et de modifier les changements qui seraient nécessaires pour y parvenir en détail.
* Comme Martin Smith l'a souligné dans un commentaire, ce ne serait pas un problème dans cette situation particulière si la table n'était pas partitionnée. Lorsque la mise à jour définit la clé sur la même valeur déterministe dans chaque ligne, Fractionner / Trier / Réduire n'est pas requis, sauf si la table est également partitionnée sur cette clé. Ainsi, une solution alternative pour cette requête consiste à ne pas partitionner la table au moment de l' échantillonnage .