A atualização falha por razões muito semelhantes às que expliquei em resposta à sua pergunta anterior .
Nesse caso, como você está potencialmente atualizando várias linhas nas quais uma coluna de chave de um índice exclusivo é alterada * , o SQL Server cria um plano que inclui operadores Split, Sort e Collapse para evitar violações intermediárias de chave exclusiva (consulte este artigo para obter detalhes) .
O operador Sort, assim introduzido, encontra uma linha intermediária (incluindo as despesas gerais) de uma largura que excede o limite; portanto, é gerado um erro. Adicionar uma OPTION (ROBUST PLAN)
dica à consulta de atualização mostra que isso é inevitável:
Msg 8619, Nível 16, Estado 2, Linha 681
O processador de consultas não pôde produzir um plano de consultas porque é necessária uma mesa de trabalho e seu tamanho mínimo de linha excede o máximo permitido de 8060 bytes. Um motivo típico pelo qual uma tabela de trabalho é necessária é uma cláusula GROUP BY ou ORDER BY na consulta. Reenvie sua consulta sem a dica ROBUST PLAN.
Os relacionamentos de dados de origem / destino não são claros para mim em uma breve olhada, mas se você puder garantir que cada operação de atualização afetará no máximo uma linha, poderá evitar a necessidade de Dividir / Classificar / Recolher adicionando TOP (1)
à instrução de atualização:
UPDATE TOP (1) [TBL_BM_HSD_SUBJECT_AN_148_REPRO_TARGET]
SET ...
Isso é um pouco complicado, no entanto. Idealmente, a construção da instrução de atualização e os índices devem fornecer informações suficientes para o otimizador, para que ele possa ver que no máximo uma linha será atualizada. Em particular, é uma prática recomendada escrever instruções de atualização determinísticas .
Dado o design estranho e a falta de clareza na pergunta, não vou nem tentar decifrar os relacionamentos de dados, nem as alterações de consulta e índice que seriam necessárias para conseguir isso em detalhes.
* Como Martin Smith apontou em um comentário, isso não seria um problema nessa situação específica se a tabela não fosse particionada. Onde a atualização define a chave com o mesmo valor determinístico em todas as linhas, Dividir / Classificar / Recolher não é necessário, a menos que a tabela também seja particionada nessa chave. Portanto, uma solução alternativa para essa consulta é não particionar a tabela no sampletime .