I'm trying to clean old data (around 5000 entries in each table) from my SQL Server database, but it takes too long (more than an hour) as I'm looping a CURSOR inside another one.
BEGIN
DECLARE @UserId int
DECLARE @productNum varchar(50)
DECLARE user_ids CURSOR FOR SELECT id
FROM Users
WHERE productId IN (SELECT ap.id
FROM Account AS a, AccountProduct AS ap
WHERE a.id = ap.accountId
AND a.name IN ('XXXXXX', 'XXXXXX', 'XXXXXX', 'XXXXXX'))
DECLARE product_cur CURSOR FOR
SELECT ap.id
FROM Account AS a, AccountProduct AS ap
WHERE a.id = ap.accountId
AND a.name IN ('XXXXXX', 'XXXXXX', 'XXXXXX', 'XXXXXX')
OPEN user_ids
FETCH NEXT FROM user_ids INTO @UserId
WHILE @@FETCH_STATUS = 0
BEGIN
OPEN product_cur
FETCH NEXT FROM product_cur INTO @productNum
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM UserRole
WHERE userId = @UserId
AND productId = (SELECT id
FROM AccountProduct
WHERE number = @productNum)
DELETE FROM AccountProduct
WHERE number = @productNum
FETCH NEXT FROM product_cur INTO @productNum
END
CLOSE product_cur
DELETE FROM Users
WHERE id = @UserId
AND accountId IN (SELECT id FROM Account
WHERE name IN ('XXXXXX', 'XXXXXX', 'XXXXXX', 'XXXXXX'))
FETCH NEXT FROM user_ids INTO @UserId
END
CLOSE user_ids
DEALLOCATE user_ids
DEALLOCATE product_cur
END
Do you know a better way to do that task?