SQL with子句dynamic where参数

时间:2010-09-14 14:46:37

标签: sql sql-server sql-server-2005 tsql

我有一个树形数据库,结构如下:

表格字段:

NodeID int 
ParentID int
Name varchar(40)
TreeLevel int

我想在with子句的第一部分中使用变量@NodeID,以便不从我感兴趣的部分开始获取所有表(请参阅Parent=@ParentID和注释)。

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 ParentID=@ParentID
   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 

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

  • 是否可以将变量传递给with子句?

提前多多感谢。

最好的问候。

2 个答案:

答案 0 :(得分: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 :(得分:0)

不幸的是< 11g这将抛出ORA-32033 - 不支持的列别名,因为不支持此功能<那个版本