2010-09-14 85 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