2010-08-12 87 views
0

我正在使用CTE來遞歸存儲在遞歸表中的數據。麻煩的是我想弄清楚如何使用「FOR XML」來構建所需的xml輸出。我有一個目錄表我正在遞歸,我希望能夠使用該數據來生成XML。構建關閉公用表表達式的XML

這裏是什麼樣的數據是simliar一個例子:我希望能夠吐出數據,像這樣

ID|TOC_ID|TOC_SECTION|TOC_DESCRIPTON|PARENT_ID 
1|I|Chapter|My Test Chapter|-1 
2|A|Section|My Test Section|1 
3|1|SubSection|My SubSection|2 

XML屬性:從 ID =追加值TOC_ID場 值=從TOC_Section字段值

<FilterData> 
    <Filter id="I" value="Chapter"> 
    <Description>My Test Chapter</Description> 
     <Filter id="I_A" value="Section"> 
     <Description>My Test Section</Description> 
      <Filter id="I_A_1" value="SubSection"> 
      <Description>My Test SubSection</Description> 
      </Filter> 
     </Filter> 
    </Filter> 
</FilterData> 

不知道我怎麼可以把CTE數據併產生類似的格式 以上。當數據位於不同的表中時,構建這種類型的輸出並不困難。

一如既往的欣賞輸入。

感謝,

小號

+0

是否有一個最大深度的3個級別的數據? – 2010-08-12 05:46:23

+0

嗨戴夫, 這就是問題...現實我看不到它會超過3或4,但你永遠不會知道 – scarpacci 2010-08-12 05:50:40

回答

0

檢查了一下Will(不知道你還在繼續)....這確實有一個32級的最大值,但是這對我的東西應該仍然可以正常工作......看不到更深入的。在另一個論壇上發現這個:

CREATE TABLE tree (id INT, name VARCHAR(5), parent_id INT) 

GO 

INSERT INTO tree VALUES (1, 'N1', NULL) 

INSERT INTO tree VALUES (3, 'N4', 1) 

INSERT INTO tree VALUES (4, 'N10', 3) 

INSERT INTO tree VALUES (5, 'N7', 3) 

GO 



CREATE FUNCTION dbo.treeList(@parent_id int) 

RETURNS XML 

WITH RETURNS NULL ON NULL INPUT 

BEGIN RETURN 

(SELECT id as "@id", name as "@name", 

CASE WHEN [email protected]_id 

THEN dbo.treeList(id) 

END 

FROM dbo.tree WHERE [email protected]_id 

FOR XML PATH('tree'), TYPE) 

END 

GO 



SELECT id AS "@id", name AS "@name", 

CASE WHEN id=1 

THEN dbo.treeList(id) 

END 

FROM tree 

WHERE id=1 

FOR XML PATH('tree'), TYPE 

現在不是那麼好,簡單嗎?

從很好的例子,在定製上http://msdn.microsoft.com/en-us/library/ms345137.aspx

1

您可以在基督教韋德的博客得到一些行駛距離從Recursive Hierarchies to XML - 這一切看起來威猛痛徹心扉!

+0

我會看看謝謝你將是 – scarpacci 2010-08-12 05:51:11

+0

你是對的那樣會是醜陋....我真的想避免寫一個CLR程序......但我可能不得不這樣做。 – scarpacci 2010-08-12 05:57:18

+0

我會嘗試儘可能遠離SQL Server進行這種轉換,如果您有選擇在代碼中執行此操作(在客戶端應用程序中),那麼我認爲您會發現更簡單。 – 2010-08-12 06:04:22