Gdy silnik zapytań zobaczy to...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... to wszystko w stylu "ooooh, buforowalne podzapytanie skalarne, będę je buforować!"
Musisz oszukać silnik zapytań, aby pomyślał, że nie można go buforować. jfar odpowiedz
było blisko, ale silnik zapytań był na tyle sprytny, aby zobaczyć tautologię MyTable.MyColumn = MyTable.MyColumn
, ale nie jest wystarczająco sprytny, aby to przejrzeć.
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
Wprowadzając tabelę zewnętrzną (MT) do podzapytania, silnik zapytań zakłada, że podzapytanie będzie wymagało ponownej oceny. Wszystko będzie działać naprawdę, ale wybrałem (zakładany) klucz podstawowy MyTable.Id, ponieważ byłby on indeksowany i powodowałby bardzo małe obciążenie.
Kursor prawdopodobnie byłby równie szybki, ale z pewnością nie jest tak zabawny.