Quando o mecanismo de consulta vê isso...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... é tudo como, "ooooh, uma subconsulta escalar em cache, eu vou armazenar isso em cache!"
Você precisa enganar o mecanismo de consulta para pensar que não pode ser armazenado em cache. resposta estava próximo, mas o mecanismo de consulta foi inteligente o suficiente para ver a tautalogia de
MyTable.MyColumn = MyTable.MyColumn
, mas não é inteligente o suficiente para ver através disso. UPDATE MyTable
SET MyColumn = (SELECT TOP 1 val
FROM @randomStuff r
INNER JOIN MyTable _MT
ON M.Id = _MT.Id
ORDER BY NEWID())
FROM MyTable M
Ao trazer a tabela externa (MT) para a subconsulta, o mecanismo de consulta assume que a subconsulta precisará ser reavaliada. Qualquer coisa funcionará realmente, mas eu fui com a chave primária (assumida) de MyTable.Id, pois seria indexada e adicionaria muito pouca sobrecarga.
Um cursor provavelmente seria tão rápido, mas certamente não é tão divertido.