webForumDet fria alternativet

Rekursiv SP

3 svar · 239 visningar · startad av Brimba

BrimbaMedlem sedan dec. 19995 875 inlägg
#1

Hej!

Låt oss säga att jag har en tabell som ser ut såhär:

id parentID type
1 0 f
7 1 f
8 7 p
13 1 p

Nu vill jag göra en SP där jag skickar in ett id och så plockar den ut antal 'f' som finns ovanför i hierarkin.

Låt oss säga att jag skickar in värde 8 då har den id 7 som förälder, alltså skall den returnera 2 tillslut eftersom id 7 i sin tur har en parent som är id 1. Id 1 däremot har ingen förälder eftersom parentID är 0

Om vi skickar in id 13 så har den parentID 1 och skall då istället returnera 1 förälder av typen f.

Kan man få lite hjälp med detta?

BrimbaMedlem sedan dec. 19995 875 inlägg
#2

Jag har börjat lite, men för varje varv returnerar den felmeddelandet:

The 'proc_countP' procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead.

ALTER  PROCEDURE proc_countP 
(
	@lngID INT
)
AS
BEGIN
	DECLARE @i INT
	DECLARE @lngParentID INT
	DECLARE cursor_a CURSOR LOCAL FOR 
		SELECT fldParentID 
		FROM tbl
		WHERE fldID = @lngID
		OPEN cursor_a
		FETCH cursor_a INTO @lngParentID
		WHILE @@fetch_status = 0
		BEGIN
			EXECUTE proc_countP @lngParentID
			FETCH cursor_a INTO @lngParentID
			set @i = @i + 1
		END 
	CLOSE cursor_a
	DEALLOCATE cursor_a
	RETURN @i
END
tohaMedlem sedan dec. 1999707 inlägg
#3

Jag började lite också... Här får du ut ett resultat från noden uppigenom alla föräldrar och till rooten. Hann inte med mer...

DECLARE @lngID INT
SET @lngID = 78

DECLARE @i INT
CREATE TABLE #t
(
	FolderID int,
	ParentID int,
	Name varchar(50),
	Description text,
	Type varchar(1)
)

INSERT INTO
	#t
SELECT
	*
FROM
	tblFileAndFolder
WHERE
	fldFileAndFolderID = @lngID
SELECT
	@i = fldFileAndFolderParentID
FROM
	tblFileAndFolder
WHERE
	fldFileAndFolderID = @lngID

WHILE @i > 0
BEGIN
	INSERT INTO
		#t
	SELECT
		*
	FROM
		tblFileAndFolder
	WHERE
		fldFileAndFolderID = @i

	SELECT
		@i = fldFileAndFolderParentID
	FROM
		tblFileAndFolder
	WHERE
		fldFileAndFolderID = @i
END

print @i
select * from #t
DROP TABLE #t
BrimbaMedlem sedan dec. 19995 875 inlägg
#4

såhär fick det bli:

ALTER    PROCEDURE proc_countFolderParents 
(
	@lngStart INT,
	@retval int output
)
AS
BEGIN

DECLARE @next INT
DECLARE @lvl INT

SET @next=@lngStart
SET @Lvl =0

WHILE @next <>0
BEGIN
	SELECT 
		@next=fldFileAndFolderParentID,
		@Lvl = @Lvl + 1
	FROM 
		tblFileAndFolder t
	WHERE
		@next = fldfileandfolderid 
END

set @retval=@lvl
125 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)