我有一个单列表Ids
,其列ID类型为uniqueidentifier
。我有另一个表MyTable
,它有一个ID列以及许多其他列。我想一次从MyTable
1000删除行,其中MyTable
的ID与Ids
中的ID匹配。
WHILE 1 = 1 BEGIN
DELETE t FROM (SELECT TOP 1000 ID FROM Ids) d INNER JOIN MyTable t ON d.ID = t.ID;
IF @@ROWCOUNT < 1 BREAK;
WAITFOR DELAY @sleeptime; -- some time to be determined later
END
这似乎不起作用。该陈述究竟应该是什么?
答案 0 :(得分:9)
试试这个:
DECLARE @BatchSize INT
SET @BatchSize = 100000
WHILE @BatchSize <> 0
BEGIN
DELETE TOP (@BatchSize) t
FROM [MyTable] t
INNER JOIN [Ids] d ON d.ID=t.ID
WHERE ????
SET @BatchSize = @@rowcount
END
有一个好处,你需要创建的唯一变量是大小,因为它用于WHILE循环检查。当删除低于100000时,它会将变量设置为该数字,在下一次传递时将没有任何要删除的内容,而rowcount将为0 ...所以你退出。干净,简单,易于理解。当WHILE做到这一点时,永远不要使用CURSOR!
答案 1 :(得分:5)
尝试Delete from MyTable WHERE ID in (select top 1000 t.ID from Ids t inner join MyTable d on d.Id = t.Id)
答案 2 :(得分:2)
您也可以尝试:
set rowcount 1000
delete from mytable where id in (select id from ids)
set rowcount 0 --reset it when you are done.
答案 3 :(得分:0)
WHILE EXISTS (SELECT TOP 1 * FROM MyTable mt JOIN IDs i ON mt.ID = t.ID)
BEGIN
DELETE TOP (1000) FROM MyTable
FROM MyTable mt JOIN IDS i ON mt.ID = i.ID
--you can wait if you want, but probably not necessary
END
- 对不起快速发帖;匆忙:)
SQL Server中的DELETE语句支持两个FROM子句;第一个FROM标识删除了行的表,第二个FROM子句用于JOINS。