4

Ids列 ID の型が である単一列の tableがありますuniqueidentifierMyTableID 列と他の多くの列を持つ別のテーブルがあります。からの ID が の ID と一致する行をMyTable一度に 1000から削除したいと思います。MyTableIds

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

Try this:

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

Has the benefit that the only variable you need to create is the size, as it uses it for the WHILE loop check. When the delete gets below 100000, it will set the variable to that number, on the next pass there will be nothing to delete and the rowcount will be 0... and so you exit. Clean, simple, and easy to understand. Never use a CURSOR when WHILE will do the trick!

于 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

You could also try:

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ステートメントは、2つのFROM句をサポートしています。最初のFROMは、行が削除されているテーブルを識別し、2番目のFROM句はJOINSに使用されます。

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

于 2012-07-03T21:06:24.310 に答える