Wenn die Abfragemaschine dies sieht...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... es ist alles wie "ooooh, eine zwischenspeicherbare skalare Unterabfrage, das werde ich zwischenspeichern!"
Sie müssen die Abfrage-Engine dazu bringen, zu glauben, dass sie nicht zwischengespeichert werden kann. jfars antworten
war nah dran, aber die Abfrage-Engine war intelligent genug, um die Tautalogie von MyTable.MyColumn = MyTable.MyColumn
zu sehen , aber es ist nicht schlau genug, das zu durchschauen.
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
Durch Einbringen der äußeren Tabelle (MT) in die Unterabfrage geht die Abfrage-Engine davon aus, dass die Unterabfrage neu ausgewertet werden muss. Alles wird wirklich funktionieren, aber ich habe mich für den (angenommenen) Primärschlüssel von MyTable.Id entschieden, da er indiziert wäre und sehr wenig Overhead hinzufügen würde.
Ein Cursor wäre wahrscheinlich genauso schnell, macht aber sicher nicht so viel Spaß.