DELETE
FROM A
WHERE xxx='100' AND @@ROWCOUNT <= 1000
Il passo SQL considera solo xxx='100'.
Grazie
Giuliano
DELETE A_Appoggio
FROM (SELECT TOP 1000 * FROM A_ppoggio WHERE CAP
= 'XXXXX') AS t1
WHERE A_Appoggio.Cap = t1.Cap
Giuliano
>-----Messaggio originale---
>.
>
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
DELETE FROM A WHERE [id] IN (select top 1000 [id] from A)
dove id è un campo qualsiasi.
Ciao
fabrizio
Giuliano
>-----Messaggio originale---
>.
>
Giuliano
>-----Messaggio originale---
>.
>
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?
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
>
>
>.
>