【发布时间】:2020-07-21 08:29:55
【问题描述】:
我正在尝试从我的 SQL Server 数据库中清除旧数据(每个表中大约 5000 个条目),但是由于我在另一个数据库中循环了一个 CURSOR,所以它需要的时间太长(超过一个小时)。
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
您知道完成这项任务的更好方法吗?
【问题讨论】:
-
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI
JOIN语法-92 SQL 标准(25 多年前),不鼓励使用它 -
不使用
CURSOR将是一个开始,尤其是光标内的光标。 SQL 是一种基于集合的语言,您应该使用基于集合的解决方案。 -
以上是完整的SQL吗?例如,您引用了光标
room_cur,但是,您从不声明它。 -
@Larnu,这是我的错误,room_cur 是 product_cur,我编辑了问题。抱歉错误
标签: sql-server