Hallo zusammen,
gegeben sei folgender Code:
Die Tabelle sieht so aus:
Der Aufruf geht folgendermassen:
Das Problem ist: wenn ich mit "PRINT" DIREKT in der SP im Management Studio was ausgebe, wird es korrekt ausgegeben, alle Werte welche in der Tabelle enthalten sind:
Kleidung
Damenkleidung
Herrenkleidung
Lebensmittel
Gemüse
Broccoli
Kohlrabi
Getränke
Obst
Orangen
Pfirsich
Will ich aber die OUTPUT-Varaible "@return" verwenden, und diese bei der Rekursion immer wieder mitliefere geht die String-Konkatenation irgendwienicht. Der String, der zurückkommt ist nur "KleidungLebensmittel"
Kleidung
Damenkleidung
Herrenkleidung
Lebensmittel
Gemüse
Broccoli
Kohlrabi
Getränke
Obst
Orangen
Pfirsich
KleidungLebensmittel
(Der Rest oberhalb kommt vom "PRINT" welches DIREKT in der SP ist...)
Die Ausgabe sollte schlussendlich folgendermassen sein:
<TopNode>
<Lebensmittel>
</Lebensmittel>
<Kleidung>
</Kleidung>
</TopNode>
NodeID's, welche NICHT Teilmenge von ParentNodeID sind, sind demzufolge KEINE Knotenpunte/Katagorien, sondern eher Artikel halt... diese sollten folgendermasssen im XML sein:
<TopNode>
<Lebensmittel>
<Obst>Pfirsich</Obst>
<Obst>Orangen</Obst>
<Gemuese>Kohlrabi</Gemuese>
<Gemuese>Broccoli</Gemuese>
</Lebensmittel>
<Kleidung>
...analog oben...
</Kleidung>
Kann mir jemand helfen?
(Und nein, ich möchte KEIN CTE verwenden, des weiteren auch nicht auf der Ebene einer "höheren Programmiersprache das Problem lösen. T-SQL sollte das bewerstelligen können würde ich sagen!)
Aber irgendwie stehe ich ein wenig "auf dem Schlauch" damit...
Grüsse und vielen Dank.
Jan
gegeben sei folgender Code:
Code:
USE test
GO
IF OBJECTPROPERTY(object_id('dbo.sp_showTreeByRecursion'), N'IsProcedure') = 1
BEGIN
DROP PROCEDURE dbo.sp_showTreeByRecursion
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE dbo.sp_showTreeByRecursion
@parentNodeID INT = NULL,
@return VARCHAR(MAX) = '' OUTPUT
AS
BEGIN
----------------------------------------------------------------------
DECLARE
@nodeID INT,
@nodeText VARCHAR(32)
DECLARE Nodes_Cursor CURSOR LOCAL FOR
SELECT
NodeID,
NodeText
FROM Nodes
WHERE ISNULL(ParentNodeID, 0) = ISNULL(@parentNodeID, 0) AND ParentNodeID IS NOT NULL
ORDER BY NodeText ASC
OPEN Nodes_Cursor
FETCH NEXT FROM Nodes_Cursor INTO @nodeID, @nodeText
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @nodeText
SET @return = @return + @nodeText
IF (SELECT COUNT ('') FROM Nodes WHERE ParentNodeID = @nodeID) > 0
BEGIN
EXEC @parentNodeID = sp_showTreeByRecursion @nodeID, @return
END
FETCH NEXT FROM Nodes_Cursor INTO @nodeID, @nodeText
END
CLOSE Nodes_Cursor
DEALLOCATE Nodes_Cursor
RETURN @parentNodeID
----------------------------------------------------------------------
END
GO
Die Tabelle sieht so aus:

Der Aufruf geht folgendermassen:
Code:
USE test
DECLARE @return2 VARCHAR(MAX)
SET @return2 = ''
EXEC sp_showTreeByRecursion null, @return2 OUTPUT
PRINT @return2
Das Problem ist: wenn ich mit "PRINT" DIREKT in der SP im Management Studio was ausgebe, wird es korrekt ausgegeben, alle Werte welche in der Tabelle enthalten sind:
Kleidung
Damenkleidung
Herrenkleidung
Lebensmittel
Gemüse
Broccoli
Kohlrabi
Getränke
Obst
Orangen
Pfirsich
Will ich aber die OUTPUT-Varaible "@return" verwenden, und diese bei der Rekursion immer wieder mitliefere geht die String-Konkatenation irgendwienicht. Der String, der zurückkommt ist nur "KleidungLebensmittel"
Kleidung
Damenkleidung
Herrenkleidung
Lebensmittel
Gemüse
Broccoli
Kohlrabi
Getränke
Obst
Orangen
Pfirsich
KleidungLebensmittel
(Der Rest oberhalb kommt vom "PRINT" welches DIREKT in der SP ist...)
Die Ausgabe sollte schlussendlich folgendermassen sein:
<TopNode>
<Lebensmittel>
</Lebensmittel>
<Kleidung>
</Kleidung>
</TopNode>
NodeID's, welche NICHT Teilmenge von ParentNodeID sind, sind demzufolge KEINE Knotenpunte/Katagorien, sondern eher Artikel halt... diese sollten folgendermasssen im XML sein:
<TopNode>
<Lebensmittel>
<Obst>Pfirsich</Obst>
<Obst>Orangen</Obst>
<Gemuese>Kohlrabi</Gemuese>
<Gemuese>Broccoli</Gemuese>
</Lebensmittel>
<Kleidung>
...analog oben...
</Kleidung>
Kann mir jemand helfen?
(Und nein, ich möchte KEIN CTE verwenden, des weiteren auch nicht auf der Ebene einer "höheren Programmiersprache das Problem lösen. T-SQL sollte das bewerstelligen können würde ich sagen!)
Aber irgendwie stehe ich ein wenig "auf dem Schlauch" damit...
Grüsse und vielen Dank.
Jan
Zuletzt bearbeitet von einem Moderator: