>e come faccio se uso quel dannato sql 2000...nn c'è un rimedio????
>la tua soluzione era stupenda ma non riesco a farla girare in
>quanto uso il 2000
>che tristezza.. n c'è un metodo per la quale io riesca
>a farlo girare su 2000.??
Il modo c'è e consiste nell'emulare la CTE ricorsiva che ho scritto nel precedente post utilizzando ad esempio una user-defined function table level:
USE tempdb;
CREATE TABLE dbo.Utenti(
idutente int NOT NULL PRIMARY KEY,
idamico int NOT NULL
);
INSERT dbo.Utenti VALUES(1, 2);
INSERT dbo.Utenti VALUES(3, 5);
INSERT dbo.Utenti VALUES(2, 4);
INSERT dbo.Utenti VALUES(4, 7);
INSERT dbo.Utenti VALUES(8, 10);
INSERT dbo.Utenti VALUES(6, 3);
INSERT dbo.Utenti VALUES(7, 9);
GO
CREATE FUNCTION dbo.ufn_Amici(
@idutente int
)
RETURNS @tree TABLE(
idutente int NOT NULL PRIMARY KEY,
idamico int NOT NULL,
Livello int NOT NULL
)
AS
BEGIN
DECLARE @lvl AS int
SET @lvl = 0
/* Anchor member */
INSERT @tree
SELECT idutente, idamico, @lvl
FROM dbo.Utenti
WHERE idutente = @idutente
/* Recursive member */
WHILE @@ROWCOUNT > 0
BEGIN
SET @lvl = @lvl + 1
INSERT @tree
SELECT U.idutente, U.idamico, @lvl
FROM dbo.Utenti AS U
JOIN @tree AS T
ON U.idutente = T.idamico
AND T.Livello = @lvl - 1
END
RETURN
END;
GO
CREATE PROCEDURE dbo.GetAmicizie(
@idutente int,
@idamico int
)
AS
SELECT *
FROM dbo.ufn_Amici(@idutente)
WHERE
/* Stabilisco l'ultimo livello di amicizia
** che devo considerare
*/
idamico <= @idamico
/* Verifico che esista una relazione di amicizia */
AND EXISTS (
SELECT *
FROM dbo.ufn_Amici(@idutente)
WHERE idamico = @idamico
);
GO
/* Esempi */
EXEC dbo.GetAmicizie 1, 9;
/* Output:
idutente idamico Livello
----------- ----------- -----------
1 2 0
2 4 1
4 7 2
7 9 3
(4 row(s) affected)
*/
EXEC dbo.GetAmicizie 1, 7;
/* Output:
idutente idamico Livello
----------- ----------- -----------
1 2 0
2 4 1
4 7 2
(3 row(s) affected)
*/
EXEC dbo.GetAmicizie 4, 9;
/* Output:
idutente idamico Livello
----------- ----------- -----------
4 7 0
7 9 1
(2 row(s) affected)
*/
EXEC dbo.GetAmicizie 4, 10;
/* Output:
idutente idamico Livello
----------- ----------- -----------
(0 row(s) affected)
*/
EXEC dbo.GetAmicizie 1, 5;
/* Output:
idutente idamico Livello
----------- ----------- -----------
(0 row(s) affected)
*/
/* Pulizia */
DROP PROCEDURE dbo.GetAmicizie;
DROP FUNCTION dbo.ufn_Amici;
DROP TABLE dbo.Utenti;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org