3

auf einem Suchtext in meiner Anwendung Je Ich habe Eltern und Kind Datensätze aus einer Tabelle in folgendem Format löschen:löschen Eltern und Kind Aufzeichnungen je nach Suchtext

tabItem

+--------+--------------+----------+-----------------+ 
| ItemId | ItemParentId | ItemName | ItemDescription | 
+--------+--------------+----------+-----------------+ 

Wenn ich zum Beispiel "Informationen" in ein Textfeld in meiner Anwendung eintippe und auf "Filter" klicke, muss ich jedes Eltern- und Kindelement entfernen, wenn das unterste Element im Baum "Informationen" enthält.

Baum für eine bessere Erklärung:

Category 1 
| 
+--- Subcategory 
    | 
    +--- Subsubcategory 
      | 
      +--- Item (contains "information" in ItemDescription) 
Category 2 
| 
+--- Subcategory 
    | 
    +--- Subsubcategory 
      | 
      +--- Item (doesn't contain "information") 

Jetzt muss ich den Artikel löschen, die „Information“ und all seine Eltern und Großeltern enthält.

Ich habe versucht, es mit Hilfe der folgenden cte:

WITH cte_toDelete 
AS 
(
    SELECT * 
    FROM tabItem 
    UNION ALL 
    SELECT cte_toDelete.* 
    FROM cte_toDelete 
    INNER JOIN tabItem ON cte_toDelete.ItemParentId = tabItem.ItemId 
) 
DELETE FROM tabItem 
WHERE ItemId IN 
(
    SELECT ItemId 
    FROM cte_toDelete 
    WHERE cte_toDelete.ItemName NOT LIKE '%' + @SearchText + '%' 
    AND cte_toDelete.ItemDescription NOT LIKE '%' + @SearchText + '%' 
) 

Aber wenn ich diese Zeilen laufen, bekomme ich folgende Fehlermeldung:

The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

Was mit meinem cte falsch ist?

Antwort

2

CTE allows The maximum 100 recursion only

wir seine Einstellung MAXRECURSION durch Verwendung ändern können, Wert für MAXRECURSION kann zwischen 0 bis 32.767

für weitere Informationen MAXRECURSION

WITH cte_toDelete 
AS 
(
    SELECT * 
    FROM tabItem 
    UNION ALL 
    SELECT cte_toDelete.* 
    FROM cte_toDelete 
    INNER JOIN tabItem ON cte_toDelete.ItemParentId = tabItem.ItemId 
) 
DELETE FROM tabItem 
WHERE ItemId IN 
(
    SELECT ItemId 
    FROM cte_toDelete 
    WHERE cte_toDelete.ItemName NOT LIKE '%' + @SearchText + '%' 
    AND cte_toDelete.ItemDescription NOT LIKE '%' + @SearchText + '%' 
) 
OPTION (MAXRECURSION 0) 
in sein