2010-09-14 82 views
4

我有一个树式数据库结构如下:SQL与条款动态where参数

表字段:

NodeID int 
ParentID int 
Name varchar(40) 
TreeLevel int 

我想的与第一部分使用变量@NodeID子句不要把所有的表从我感兴趣的部分开始(参见[email protected]和注释)。

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 

这引发了一些错误,但我的问题是:

  • 可以将一个变量传递到与条款?

非常感谢。

此致敬礼。

Jose

回答

7

是的。

declare @ParentID int 
set @ParentID = 10; 

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

你可以将整个东西包装在参数化的内联TVF中。最后一种方法的例子。

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

谢谢,我看,关键是要完成“;”在with子句之前。 – Sosi 2010-09-14 14:55:29

+2

啊是的。这是需要分号的唯一地方之一。 – 2010-09-14 14:56:14

+1

+1尼斯的答案... – kevchadders 2010-09-14 15:00:28

0

不幸的是<11克这将引发ORA-32033 - 不支持列的别名,因为此功能不支持<该版本

+0

欢迎来到SO。你能否更具体地说明不支持的内容,并提供参考。 – gzm0 2013-05-10 15:24:05