SQL with子句dynamic where参数

Sos*_*osi 4 sql t-sql sql-server sql-server-2005

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

表字段:

NodeID int 
ParentID int
Name varchar(40)
TreeLevel int
Run Code Online (Sandbox Code Playgroud)

我想@NodeID在with子句的第一部分中使用一个变量,而不是从我感兴趣的部分开始获取所有表(参见where Parent=@ParentID和comment).

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 
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢提前.

最好的祝福.

何塞

Mar*_*ith 7

是.

declare @ParentID int
set @ParentID = 10;

with RecursionTest (NodeID,ParentID,ThemeName) ....
Run Code Online (Sandbox Code Playgroud)

您也可以将整个内容包装在参数化的内联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)
Run Code Online (Sandbox Code Playgroud)

  • 没错.这是需要分号的唯一地方之一. (2认同)