Cuando el motor de consultas vea esto...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... todo es como, "ooooh, una subconsulta escalar almacenable en caché, ¡voy a almacenar eso en caché!"
Debe engañar al motor de consultas para que piense que no se puede almacenar en caché. jfar's respuesta
estuvo cerca, pero el motor de consulta fue lo suficientemente inteligente como para ver la tautalogía de MyTable.MyColumn = MyTable.MyColumn
, pero no es lo suficientemente inteligente como para ver a través de esto.
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
Al incluir la tabla externa (MT) en la subconsulta, el motor de consulta asume que la subconsulta deberá volver a evaluarse. Cualquier cosa funcionará realmente, pero opté por la clave principal (supuesta) de MyTable.Id, ya que estaría indexada y agregaría muy poca sobrecarga.
Un cursor probablemente sería igual de rápido, pero ciertamente no es tan divertido.