2010-04-19 49 views
0

我想談談這個查詢到正規內聯SQL,而無需使用存儲過程有沒有辦法把這個查詢到正規內聯SQL

declare @nod hierarchyid 
select @nod = DepartmentHierarchyNode 
from Organisation 
where DepartmentHierarchyNode = 0x6BDA 

select * 
from Organisation 
where @nod.IsDescendantOf(DepartmentHierarchyNode) = 1 

有沒有辦法做到這一點?

回答

3

當然,完全沒有問題....

using(SqlConnection con = new SqlConnection(......)) 
{ 
    string stmt = 
     "declare @nod hierarchyid; " + 
     "select @nod = DepartmentHierarchyNode from Organisation where DepartmentHierarchyNode = 0x6BDA; " + 
     "select * from Organisation where @nod.IsDescendantOf(DepartmentHierarchyNode) = 1"; 

    using(SqlCommand cmd = new SqlCommand(stmt, con)) 
    { 
     con.Open(); 
     using(SqlDataReader rdr = cmd.ExecuteReader()) 
     { 
     // here, read your values back 
     } 
     con.Close(); 
    } 
} 

應該這樣做。在內聯SQL查詢中,我沒有發現有多個語句出現問題,真的。

+0

究竟發生了什麼。所以基本上它幾乎是一樣的東西呢?在問這個問題之前我應該​​檢查一下。我感謝您的幫助。 – Luke101 2010-04-19 05:37:25

+0

我不完全確定,但我想他可能一直在問怎麼參數化'hierarchyid',這涉及到使用'SqlHierarchyId'類(我認爲)。請注意,整件事情沒有什麼意義,因爲他只是選擇了他在第一個查詢中已經存在的相同的層次結構ID ......整個上半年似乎是多餘的。 – Aaronaught 2010-04-19 05:37:36

+0

@Aaronaught:好吧,他可以使用「Microsoft.SqlServer.Types」程序集中的「SqlHierarchyId」類型,並以某種方式爲該參數提供有效值 – 2010-04-19 05:49:54

0

當然,你可以把它變成一個單一的SELECT語句,避免了CTE:

SELECT t1.* 
FROM Organisation t1, 
    (SELECT * FROM Organisation 
     WHERE DepartmentHierarchyNode = 0x6BDA) t2 
WHERE t1.DepartmentHierarchyNode = t2 OR 
    t2.DepartmentHierarchyNode.IsDescendantOf(t1.DepartmentHierarchyNode) = 1 
相關問題