一次删除一个表中的行

时间:2012-07-03 20:55:35

标签: sql sql-server database delete-row

我有一个单列表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

这似乎不起作用。该陈述究竟应该是什么?

4 个答案:

答案 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.

http://msdn.microsoft.com/en-us/library/ms188774.aspx

答案 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。

请参阅:http://msdn.microsoft.com/en-us/library/ms189835.aspx