>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