Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DELETE TOP 1000

115 views
Skip to first unread message

giuliano

unread,
Apr 18, 2003, 5:26:54 AM4/18/03
to

Ciao a tutti,
vorrei cancellare un numero n di righe da una tabella ma
con la @@ROWCOUNT nella clausola WHERE non ottengo il
risultato sperato.

DELETE
FROM A
WHERE xxx='100' AND @@ROWCOUNT <= 1000

Il passo SQL considera solo xxx='100'.

Grazie

Giuliano

Giuliano

unread,
Apr 18, 2003, 5:42:47 AM4/18/03
to

Ho provato anche in questo modo ma il risultato è sempre
lo stesso ( sembra ignorarere il fatto di cnacellare solo
le prime 1000 ).

DELETE A_Appoggio
FROM (SELECT TOP 1000 * FROM A_ppoggio WHERE CAP
= 'XXXXX') AS t1
WHERE A_Appoggio.Cap = t1.Cap

Giuliano

>-----Messaggio originale---

>.
>

Lorenzo Benaglia

unread,
Apr 18, 2003, 5:53:01 AM4/18/03
to

Ciao Giuliano,

come riportano i Books Online, la funzione @@ROWCOUNT "Returns the number of
rows affected by the last statement".
Quindi non puoi utilizzarla in quel modo.
Ho pensato di risolvere il problema ricorrendo ad una subquery che calcola
il numero di righe che soddisfano il criterio Campo = valore e di procedere
alla cancellazione solo nel caso il cui il numero di righe sia inferiore o
uguale a 1000.

USE tempdb
GO

/* Creo la tabella dbo.Test */
CREATE TABLE dbo.Test(
Field1 int NOT NULL,
Field2 char(3) NOT NULL
)
GO

/* La popolo con 2000 righe valorizzate a 'xxx'
** e 500 righe valorizzate a 'yyy'
*/
DECLARE @idx int
SET @idx = 0

SET NOCOUNT ON
WHILE @idx < 2000
BEGIN
INSERT dbo.Test VALUES(@idx, 'xxx')
SET @idx = @idx + 1
END

WHILE @idx < 2500
BEGIN
INSERT dbo.Test VALUES(@idx, 'yyy')
SET @idx = @idx + 1
END
SET NOCOUNT OFF
GO

/* Cerco di eliminare le righe valorizzate a 'xxx' */
DELETE dbo.Test
WHERE Field2 = 'xxx' AND
(
SELECT COUNT(*)
FROM dbo.Test
WHERE Field2 = 'xxx'
) <= 1000
GO

/* Output:

(0 row(s) affected)

*/

/* Elimino le righe valorizzate a 'yyy' */
DELETE dbo.Test
WHERE Field2 = 'yyy' AND
(
SELECT COUNT(*)
FROM dbo.Test
WHERE Field2 = 'yyy'
) <= 1000

/* Output:

(500 row(s) affected)

*/

/* Pulizia */
DROP TABLE dbo.Test

> Grazie
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server

UGIdotNET - http://www.ugidotnet.org
UGISS - http://www.ugiss.org


fabriZio

unread,
Apr 18, 2003, 6:11:34 AM4/18/03
to
Potresti anche fare cosi:

DELETE FROM A WHERE [id] IN (select top 1000 [id] from A)

dove id è un campo qualsiasi.


Ciao

fabrizio

giuliano

unread,
Apr 18, 2003, 6:10:04 AM4/18/03
to

Questo però non risolve il mio problema.
Io devo cancellare 1000 righe dove campo=valore.
Se ho 20000 righe che mi soddisfano la clausola
campo=valore io voglio cancellare le prime 1000.
In questo modo avrò 19000 righe che mi soddisfano la
clausola campo=valore.

Giuliano

>-----Messaggio originale---

>.
>

giuliano

unread,
Apr 18, 2003, 6:16:51 AM4/18/03
to
Anche la soluzione di fabriZio non tiene conto di ( top
1000 ) !

Giuliano


>-----Messaggio originale---

>.
>

Lorenzo Benaglia

unread,
Apr 18, 2003, 6:32:32 AM4/18/03
to
giuliano wrote:
> Questo perň non risolve il mio problema.

> Io devo cancellare 1000 righe dove campo=valore.
> Se ho 20000 righe che mi soddisfano la clausola
> campo=valore io voglio cancellare le prime 1000.
> In questo modo avrň 19000 righe che mi soddisfano la
> clausola campo=valore.

Ciao Giuliano,

OK, avevo interpretato male la richiesta (anche se non so a cosa possa
servirti) :-)
Puoi ricorrere alla clausola SET ROWCOUNT che termina l'esecuzione della
query dopo il numero specificato di righe restituite.

Esempio:

USE tempdb
GO


/* Elimino solo le prime 1000 righe valorizzate a 'xxx' */
SET ROWCOUNT 1000


DELETE dbo.Test
WHERE Field2 = 'xxx'

SET ROWCOUNT 0
GO

/* Output:

(1000 row(s) affected)

*/

/* Elimino solo le prime 1000 righe valorizzate a 'yyy' */
SET ROWCOUNT 1000


DELETE dbo.Test
WHERE Field2 = 'yyy'

SET ROWCOUNT 0
GO

/* Output:

(500 row(s) affected)

*/

/* Pulizia */
DROP TABLE dbo.Test

Cosě puň andare?

Giuliano

unread,
Apr 18, 2003, 6:44:05 AM4/18/03
to
PERFETTO !!!

Grazie
Giuliano


>-----Messaggio originale---
>giuliano wrote:
>> Questo però non risolve il mio problema.


>> Io devo cancellare 1000 righe dove campo=valore.
>> Se ho 20000 righe che mi soddisfano la clausola
>> campo=valore io voglio cancellare le prime 1000.

>> In questo modo avrò 19000 righe che mi soddisfano la

>Così può andare?


>
>Ciao!
>
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>
>UGIdotNET - http://www.ugidotnet.org
>UGISS - http://www.ugiss.org
>
>

>.
>

0 new messages