Khi công cụ truy vấn thấy điều này ...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... tất cả giống như, "ooooh, một truy vấn con vô hướng có thể truy cập được, tôi sẽ lưu vào bộ nhớ cache đó!"
Bạn cần đánh lừa công cụ truy vấn nghĩ rằng nó không thể truy cập được. jfar's câu trả lời
đã đóng, nhưng công cụ truy vấn đủ thông minh để xem danh mục của MyTable.MyColumn = MyTable.MyColumn
, nhưng không đủ thông minh để nhìn thấu điều này.
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
Bằng cách đưa bảng bên ngoài (MT) vào truy vấn con, công cụ truy vấn giả định rằng truy vấn con sẽ cần được đánh giá lại. Mọi thứ sẽ hoạt động thực sự, nhưng tôi đã sử dụng khóa chính (giả định) của MyTable.Id vì nó sẽ được lập chỉ mục và sẽ thêm rất ít chi phí.
Một con trỏ có thể sẽ nhanh như vậy, nhưng chắc chắn là không thú vị bằng.