När frågemotorn ser detta...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... allt är som, "ooooh, en cachbar skalär underfråga, jag ska cache den!"
Du måste lura frågemotorn att tro att den inte är cachbar. jfars svara
var nära, men frågemotorn var smart nog att se tautalogin för MyTable.MyColumn = MyTable.MyColumn
, men det är inte smart nog att se igenom det här.
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
Genom att ta in den yttre tabellen (MT) i underfrågan, antar frågemotorn att underfrågan måste omvärderas. Allt kommer verkligen att fungera, men jag använde den (förmodade) primärnyckeln för MyTable.Id eftersom den skulle indexeras och lägga till väldigt lite overhead.
En markör skulle förmodligen vara lika snabb, men är absolut inte lika rolig.