So rufen Sie eine rekursive Funktion in sql server
Ich habe eine Tabelle wie folgt
cat_id Cat_Name Main_Cat_Id
1 veg null
2 main course 1
3 starter 1
4 Indian 2
5 mexican 2
6 tahi 3
7 chinese 3
8 nonveg null
9 main course 8
10 indian 9
11 starter 8
12 tahi 11
13 chinese 11
(Main_Cat_Id ist cat_id der zuvor hinzugefügte Kategorie, in die es gehört)
Diese Tabelle wird verwendet für die Kategorien Produkt, wo veg Kategorie hat zwei Unterkategorien dieser Kategorie Hauptgericht und starter die Identifizierung von main_cat_id
und diese Unterkategorien hat wiederum sub-Kategorie indischen und mexikanischen
Und diese Kategorisierung ist abhängig von der Benutzer; er kann hinzufügen, mehr Unterkategorien, die auf Indische, Mexikanische, so dass er kann jede beliebige Ebene der Kategorisierung
nun muss ich Sie alle Unterkategorien, von jedem Punkt, wie wenn ich Gemüse habe ich zu wählen
(1)veg > (2)main course(1) > (4)indian(2)
> (5)mexican(2)
> (3)starter(1) > (6)thai(3)
> (7)chinese(3)
bilden die Zeichenfolge als 1,2,4,5,3,6,7
dazu schrieb ich eine sql-Funktion als
CREATE FUNCTION [dbo].[GetSubCategory_TEST]
( @MainCategory int, @Category varchar(max))
RETURNS varchar(max)
AS
BEGIN
IF EXISTS (SELECT Cat_Id FROM Category WHERE Main_Cat_Id=@MainCategory)
BEGIN
DECLARE @TEMP TABLE
(
CAT_ID INT
)
INSERT INTO @TEMP(CAT_ID) SELECT Cat_Id FROM Category WHERE Main_Cat_Id=@MainCategory
DECLARE @TEMP_CAT_ID INT
DECLARE CUR_CAT_ID CURSOR FOR SELECT CAT_ID FROM @TEMP
OPEN CUR_CAT_ID
WHILE 1 =1
BEGIN
FETCH NEXT FROM CUR_CAT_ID
INTO @TEMP_CAT_ID;
IF @@FETCH_STATUS <> 0
SET @Category=@Category+','+ CONVERT(VARCHAR(50), @TEMP_CAT_ID)
SET @Category = [dbo].[GetSubCategory](@TEMP_CAT_ID,@Category)
END
CLOSE CUR_CAT_ID
DEALLOCATE CUR_CAT_ID
END
return @Category
END
aber diese Funktion halten auf ausführen, und nicht gibt die gewünschte Ausgabe, die ich nicht versteht, was Los ist plz mir helfen, dieses
while 1=1
?? es gehe unendlich! ?Möglich, Duplikat der SQL rekursive Abfrage liefert alle Vorfahren eines items
InformationsquelleAutor Rhushikesh | 2014-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht, eine rekursive Funktion zu erstellen, können Sie eine Rekursive CTE.
Etwas wie
Lesen Sie die Antwort! Du verwechselst die Beispiel-Daten Bau benötigt, passend zu Ihrem Beispiel mit der nachfolgenden Lösung für das gestellte problem.
InformationsquelleAutor Adriaan Stander
Ich schäme mich, aber ich habe @astander scipt zu geben string result.
Ersten, die ich erstellt Daten, die Sie gab.
Zweitens sammle ich die Zeilen die ich brauche
Und dann mit
XML
ich habe alles in eine Zeile (FunktionSTUFF
ersten Komma entfernt)InformationsquelleAutor Darka
Den cursor looping unendlich, weil Sie gebeten, es zu halten zu gehen, bis 1 nicht mehr gleich 1:
1=1
ist immer wahr, also wird die Schleife nie endet, und Sie nicht explizitbreak
aus es überall.Würden Sie gut tun, um zu studieren einige Beispiele für Cursor, zum Beispiel diese eine in der Microsoft T-SQL-Dokumentation. Sie sind ganz formelhaft und die wichtigsten syntax nur selten, muss viel variieren.
Den standard Ansatz nach
open
ing der cursor ist zu tun, eine erstefetch next
das erste Ergebnis erhalten, dann öffnen Sie einwhile
Schleife abhängig@@FETCH_STATUS = 0
(0 Bedeutung erfolgreich).Weil Sie suchen nur für erfolglosen cursor fetch-Staaten in Ihrem cursor:
Die Einstellung von
@Category
wird nur geschehen, wenn der cursor überschritten hat die Letzte Zeile in der Gruppe. Ich vermute, das ist genau das, was Sie nicht wollen.Ich bin auch nicht sicher über die Festlegung des lösungsumfangs der
@Category
variable, da es eine Eingabe-parameter der Funktion; ich in der Regel erstellen Sie neue Variablen innerhalb einer Funktion zu arbeiten, aber aus der Spitze von meinem Kopf ich bin nicht sicher, dass dies tatsächlich ein problem ist oder nicht.Generell, obwohl ich nicht ganz verstehen, was Sie zu erreichen versuchen, hier eine rekursive Funktion mit einem cursor ist wohl nicht der richtige Weg, es zu tun, als Adriaan Stander Antwort schlägt.
InformationsquelleAutor Stuart J Cuthbertson