Я попытался создать сценарий, который циклически удаляет случайное количество строк из таблицы для каждой кампании. Это работает для первой кампании, но не для остальных.
Ниже мой сценарий. Я объявляю удаленную переменную участников, затем использую функцию rand()
для генерации случайного числа, которое затем использую в своем операторе удаления, используя CTE и устанавливая номер строки. Это работает для первой кампании, но не для остальных, хотя когда я смотрю на оператор печати, он показывает сгенерированное случайное число.
DECLARE @CampaignID INT
SET @CampaignID = 1
WHILE @CampaignID <= 1000
BEGIN
DECLARE @AttendeesDeleted INT
SELECT @AttendeesDeleted = ROUND(RAND() * 10000, 0)
;WITH attendees AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY CampaignAttendeeID) AS rn
FROM Warehouse.CampaignAttendees
)
DELETE
FROM attendees
WHERE rn > @AttendeesDeleted
AND CampaignID = @CampaignID
PRINT 'Attendees Deleted: ' + CAST(@AttendeesDeleted AS VARCHAR)
SET @CampaignID = @campaignID + 1
END
Нужно ли мне создать сценарий случайного выбора как функцию, а затем запустить его как функцию?
Я добавил снимок экрана, на котором показано, как я запускаю этот скрипт для первых двух кампаний. Он удаляет правильный номер для первой кампании, но затем удаляет все строки для второй кампании, хотя в сценарии печати указано количество, которое следует удалить.
Спасибо, Питер. Это сделало свое дело
Часть WHERE CampaignID = @CampaignID
принадлежит оператору SELECT, а не оператору DELETE.
В результате этого изменения ROW_NUMBER()
будет рассчитываться для строк, принадлежащих кампании, а не для всех строк в таблице.
Вам необходимо объяснить, что означает «не работает». Примеры данных очень помогут.