SQL Server在同一语句中选择和更新?

时间:2009-12-02 22:03:30

标签: sql-server sql-server-2008 select

我有一个像这样的SQL查询:

SELECT TOP (@TopType) AdvertID, IsAdvertImage, AdvertData
FROM Adverts
WHERE AdvertSize = @AdvertSize
ORDER BY NEWID()

表格广告中的每一行还有一个名为“视图”的列,是否可以为已获取的横幅增加1的视图?所以我将TopType设置为4并获得4个横幅,这些横幅的视图增加了1,这样我就可以跟踪横幅显示的次数。

1 个答案:

答案 0 :(得分:5)

WITH cte AS (
 SELECT TOP (@TopType) 
 AdvertID, IsAdvertImage, AdvertData, Views
 FROM Adverts
 WHERE AdvertSize = @AdvertSize
 ORDER BY NEWID())
UPDATE cte 
 SET Views = Views + 1
OUTPUT INSERTED.AdvertID
 , INSERTED.IsAdvertImage
 , INSERTED.AdvertData;

但是ORDER BY NEWID()会表现得很糟糕。即使TOP(1)仍然需要扫描整个表,在tempdb中对所选列进行假脱机,排序,从中取出TOP。并且还将成为Views = Views + 1 X-lock和全扫描S-lock之间的更新冲突富矿......