4

我有一个单列表Ids,它的列 ID 是 type uniqueidentifier。我有另一个表MyTable,它有一个 ID 列以及许多其他列。我想MyTable一次删除 1000 行,其中的 IDMyTableIds.

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

4 回答 4

10

试试这个:

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 时,它会将变量设置为该数字,在下一次传递时将没有任何内容可删除,并且行数将为 0......所以你退出。干净,简单,易于理解。当 WHILE 可以解决问题时,切勿使用 CURSOR!

于 2012-07-03T21:03:09.843 回答
6

尝试Delete from MyTable WHERE ID in (select top 1000 t.ID from Ids t inner join MyTable d on d.Id = t.Id)

于 2012-07-03T20:59:51.200 回答
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

于 2012-07-03T21:01:37.007 回答
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

于 2012-07-03T21:06:24.310 回答