Delete Query

martedì 16 gennaio 2007 - 16.14

melmar20 Profilo | Junior Member

Ciao a tutti , sapreste dirmi come posso fare a passare un parametro di tipo intero ad una procedura che selezioni tutte le tuple che hanno il valore di una colonna uguale al parametro passato,ed una volta selezionate me le cancelli?

lbenaglia Profilo | Guru

>sapreste dirmi come posso fare a passare un parametro
>di tipo intero ad una procedura che selezioni tutte le tuple
>che hanno il valore di una colonna uguale al parametro passato,ed
>una volta selezionate me le cancelli?

Ciao melmar20,

che DBMS utilizzi?
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

melmar20 Profilo | Junior Member

Microsoft SQL Server,

lbenaglia Profilo | Guru

>Microsoft SQL Server

Osserva il seguente esempio:

USE tempdb; CREATE TABLE dbo.Students( StudentID int NOT NULL IDENTITY PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL ); GO CREATE PROCEDURE dbo.up_DropStudent( @StudentID int ) AS DELETE dbo.Students WHERE StudentID = @StudentID; GO INSERT dbo.Students VALUES ('Lorenzo', 'Benaglia'); INSERT dbo.Students VALUES ('Luca', 'Bianchi'); INSERT dbo.Students VALUES ('Andrea', 'Montanari'); /* Elimino lo studente Lorenzo Benaglia */ EXEC dbo.up_DropStudent 1; /* Verifica */ SELECT * FROM dbo.Students; /* Output: StudentID FirstName LastName ----------- ---------- ---------- 2 Luca Bianchi 3 Andrea Montanari (2 row(s) affected) */ /* Pulizia */ DROP PROCEDURE dbo.up_DropStudent; DROP TABLE dbo.Students;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

melmar20 Profilo | Junior Member

Ciao il tuo esempio mi è stato molto utile,solo che ho un'altro problema che non riesco a risolvere....

o bisogno di fare un CASCADE su una stessa tabella e Microsoft SQL Server non mi permette di farlo....

non sò sai percaso darmi alcune indicazioni a riguardo?

lbenaglia Profilo | Guru

>Ciao il tuo esempio mi è stato molto utile
Bene, accetta la risposta e chiudiamo il thread

>,solo che ho un'altro
>problema che non riesco a risolvere....
>
>o bisogno di fare un CASCADE su una stessa tabella e Microsoft
>SQL Server non mi permette di farlo....
>
>non sò sai percaso darmi alcune indicazioni a riguardo?

Certo, non puoi definire un constraint FOREIGN KEY CASCADE sulla stessa tabella dato che si verrebbe a creare una ricorsione potenzialmente infinita, ma puoi risolvere il problema tramite un trigger di delete:

USE tempdb; CREATE TABLE dbo.Students( StudentID int NOT NULL PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL, BossID int NULL ); GO CREATE TRIGGER dbo.trD_Students ON dbo.Students FOR DELETE AS DELETE dbo.Students FROM dbo.Students AS S JOIN DELETED AS D ON S.BossID = D.StudentID; GO CREATE PROCEDURE dbo.up_DropStudent( @StudentID int ) AS DELETE dbo.Students WHERE StudentID = @StudentID; GO INSERT dbo.Students VALUES (1, 'Lorenzo', 'Benaglia', NULL); INSERT dbo.Students VALUES (2, 'Luca', 'Bianchi', 1); INSERT dbo.Students VALUES (3, 'Andrea', 'Montanari', 1); INSERT dbo.Students VALUES (4, 'Andrea', 'Benedetti', 2); INSERT dbo.Students VALUES (5, 'Gianluca', 'Hotz', 2); /* Elimino lo studente Lorenzo Benaglia e tutti i suoi "sudditi" :-D */ EXEC dbo.up_DropStudent 1; /* Verifica */ SELECT * FROM dbo.Students; /* Output: StudentID FirstName LastName BossID ----------- ---------- ---------- ----------- 4 Andrea Benedetti 2 5 Gianluca Hotz 2 (2 row(s) affected) */ /* Pulizia */ DROP PROCEDURE dbo.up_DropStudent; DROP TABLE dbo.Students;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

melmar20 Profilo | Junior Member

ok ma facendo in questo modo riuscirei ad eliminare solamente i figli di un Boss....
io vorrei eliminare anceh i sottofilgi.....

cerco di spiegarmi meglio:

Tabella(id,Nome,IdBoss)

nella tabella ho i seguenti dati:

1-Lorenzo Battglia-NuLL
2-Claudio Luci-Null
3-Tico Giucas-1
4-Mario Bianchi-3
5-Luca Rossi-4

Dunque se io vado a cancellare la tupla che ha come indice 1 vorrei che si cancellassero anche le tuple con indici 3,4,5 perchè queste comunque fanno riferimento,anche se non direttamente, alla tupla con indice 1...

In pratica la mia è una sorta di struttura ad albero quindi cancellando una radice vorrei che si cancellassere anche i figli,e poi i figli dei figli....e così discorrendo

lbenaglia Profilo | Guru

>ok ma facendo in questo modo riuscirei ad eliminare solamente
>i figli di un Boss....
Vero, hai ragione.
Se utilizzi SQL Server 2005 puoi utilizzare una Common Table Expression ricorsiva:

USE tempdb; CREATE TABLE dbo.Students( StudentID int NOT NULL PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL, BossID int NULL ); GO CREATE PROCEDURE dbo.up_DropStudent( @StudentID int ) AS WITH CTE_Students (StudentID, FirstName, LastName, BossID, Level) AS ( /* Anchor member definition */ SELECT *, 0 AS Level FROM dbo.Students WHERE StudentID = @StudentID UNION ALL /* Recursive member definition */ SELECT S.*, C.Level + 1 FROM dbo.Students AS S JOIN CTE_Students AS C ON S.BossID = C.StudentID ) DELETE dbo.Students FROM dbo.Students AS S JOIN CTE_Students AS C ON S.StudentID = C.StudentID; GO INSERT dbo.Students VALUES (1, 'Lorenzo', 'Benaglia', NULL); INSERT dbo.Students VALUES (2, 'Luca', 'Bianchi', 1); INSERT dbo.Students VALUES (3, 'Andrea', 'Montanari', 1); INSERT dbo.Students VALUES (4, 'Andrea', 'Benedetti', 2); INSERT dbo.Students VALUES (5, 'Gianluca', 'Hotz', 2); INSERT dbo.Students VALUES (6, 'Marcello', 'Poletti', 5); /* Elimino lo studente Luca Bianchi e tutti i suoi "sudditi" :-D */ EXEC dbo.up_DropStudent 2; /* Verifica */ SELECT * FROM dbo.Students; /* Output: StudentID FirstName LastName BossID ----------- ---------- ---------- ----------- 1 Lorenzo Benaglia NULL 3 Andrea Montanari 1 (2 row(s) affected) */ /* Pulizia */ DROP PROCEDURE dbo.up_DropStudent; DROP TABLE dbo.Students;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5