SQL Server выбрать и обновить в одном выражении? - PullRequest
2 голосов
/ 03 декабря 2009

У меня есть SQL-запрос, подобный этому:

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

У каждой строки в таблице Adverts также есть столбец с названием Views. Можно ли также увеличить количество просмотров с 1 для выбранных баннеров? Поэтому я установил для TopType значение 4 и получил 4 баннера, количество просмотров этих баннеров увеличилось с 1, чтобы я мог отслеживать количество показов баннера.

1 Ответ

5 голосов
/ 03 декабря 2009
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-замками с полной проверкой ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...