Wanneer de query-engine dit ziet...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... het is allemaal zo van, "ooooh, een cachebare scalaire subquery, die ga ik cachen!"
U moet de query-engine voor de gek houden door te denken dat deze niet in cache kan worden opgeslagen. jfar's antwoord
was dichtbij, maar de query-engine was slim genoeg om de tautalogie van MyTable.MyColumn = MyTable.MyColumn
te zien , maar het is niet slim genoeg om hier doorheen te kijken.
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
Door de buitenste tabel (MT) in de subquery te plaatsen, gaat de query-engine ervan uit dat de subquery opnieuw moet worden geëvalueerd. Alles zal echt werken, maar ik koos voor de (veronderstelde) primaire sleutel van MyTable.Id omdat het zou worden geïndexeerd en heel weinig overhead zou toevoegen.
Een cursor zou waarschijnlijk net zo snel zijn, maar is zeker niet zo leuk.