2010-09-14 6 views
4

J'ai une base de données de type arbre avec la structure suivante:SQL avec clause dynamique où le paramètre

Tableau champs:

NodeID int 
ParentID int 
Name varchar(40) 
TreeLevel int 

Je voudrais utiliser une @NodeID variable dans la première partie de la avec clause de ne pas obtenir toute la table juste commencer à partir de la pièce qui m'intéresse (voir où [email protected] et commenter).

with RecursionTest (NodeID,ParentID,ThemeName) 
as 
(
    --if i remove the where from here it spends too much time (the tree is big)-- 
    select Nodeid,ParentID,Name from TreeTable where [email protected] 
    union all 
    select T0.Nodeid, 
      T0.ParentID, 
      T0.Name 
    from 
    TreeTable T0 
    inner join RecursionTest as R on T0.ParentID = R.NodeID 
) 
select * from RecursionTest 

Cela jette quelques erreurs, mais ma question est la suivante:

  • est possible de passer une variable à une à la clause?

Merci beaucoup d'avance.

Cordialement.

Jose

Répondre

7

Oui.

declare @ParentID int 
set @ParentID = 10; 

with RecursionTest (NodeID,ParentID,ThemeName) .... 

Vous pouvez aussi intégrer le tout dans un TVF en ligne paramétré. Exemple de cette dernière approche.

CREATE FUNCTION dbo.RecursionTest (@ParentId INT) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH RecursionTest (NodeID,ParentID,ThemeName) 
    AS 
     (
     /*... CTE definition goes here*/ 
    ) 
    SELECT NodeID,ParentID,ThemeName 
    FROM RecursionTest 
) 
GO 

SELECT NodeID,ParentID,ThemeName 
FROM dbo.RecursionTest(10) 
OPTION (MAXRECURSION 0) 
+1

Merci, je vois que la clé est de terminer avec « ; » avant la clause with. – Sosi

+2

Ah oui. C'est l'un des seuls endroits où les points-virgules sont requis. –

+1

+1 Bonne réponse ... – kevchadders

0

Malheureusement < 11g cela lancera une ORA-32033 - aliasing colonne non pris en charge, car cette fonctionnalité est pas prise en charge < cette version

+0

Bienvenue à SO. Pourriez-vous être plus précis sur ce qui n'est pas soutenu et peut-être fournir une référence. – gzm0

Questions connexes