2014-07-24 29 views
1

我正嘗試在使用FOR XML路徑的SQL 2008中創建xml輸出。這是工作的罰款:在具有相同元素名稱的FOR XML Path T-SQL查詢中多次使用屬性

<Taxonomy> 
     <Category Level="1">Clothing</Category> 
     <SubCategory Level="2">Jeans</SubCategory> 
</Taxonomy> 

但我想輸出是:

<Taxonomy> 
     <Category Level="1">Clothing</Category> 
     <Category Level="2">Jeans</Category> 
</Taxonomy> 

當然你也可以爲如下代碼:

1 as 'Taxonomy/Category/@Level', 
2 as 'Taxonomy/Category/@Level', 
t.MainCat as 'Taxonomy/Category', 
t.SubCat as 'Taxonomy/Category', 

但是,這給出了一個錯誤信息: 以屬性爲中心的列'重複列名稱。相同的屬性不能在同一個XML標籤上多次生成。

可以做些什麼來獲得所需的輸出? 子選擇工作還是某種交叉應用?或者也許是一個工會?但是如何?

----編輯 - 幾個答案後,用下面的解決方案提出了:

SELECT 
1 as 'Category/@Level', 
t.Cat as 'Category' 
FROM table t 

UNION 

SELECT 
2 as 'Category/@Level', 
t.SubCat as 'Category' 
FROM table t 

FOR XML PATH (''), ROOT('Taxonomy') 

給出了這樣的輸出:

<Taxonomy> 
    <Category Level="1">Clothing</Category> 
    <Category Level="2">Jeans</Category> 
</Taxonomy> 

還是要弄清楚如何把這個部分編碼的更大的代碼與幾個'嵌套'FOR XML的已經

+0

你能顯示實際的查詢和一些示例數據嗎? –

+0

您真正的查詢是否打算生成多個Taxonomy元素?即每個「t」有一個元素(無論是「t」)? – AaronLS

+0

是的,每個類別都有一個元素,每個元素都有一個用於類別級別(層次結構)的屬性 – J3FFK

回答

2

快捷方法可能不會削減它。 AUTO和PATH不喜歡具有相同名稱的多個元素。看起來你將不得不使用FOR XML EXPLICIT命令。

它的工作,但很麻煩。

樣品:

--Generate Sample Data 
--FOR XML EXPLICIT requires two meta fields: Tag and Parent 
--Tag is the ID of the current element. 
--Parent is the ID of the parent element, or NULL for root element. 

DECLARE @DataTable as table 
    (Tag int NOT NULL 
    , Parent int 
    , TaxonomyValue nvarchar(max) 
    , CategoryValue nvarchar(max) 
    , CategoryLevel int) 

--Fill with sample data: Category Element (2), under Taxonomy(1), with no Taxonomy value. 
INSERT INTO @DataTable 
VALUES (2, 1, NULL, 1, 'Clothing') 
    , (2, 1, NULL, 2, 'Jeans') 

--First part of query: Define the XML structure 
SELECT 
    1 as Tag --root element 
    , NULL as Parent 
    , NULL as [Taxonomy!1]  --Assign Taxonomy Element to the first element, aka root. 
    , NULL as [Category!2]  --Assign Category Element as a child to Taxonomy. 
    , NULL as [Category!2!Level] --Give Category an Attribute 'Level' 

--The actual data to fill the XML 
UNION 
SELECT 
    Data.Tag 
    , Data.Parent 
    , Data.TaxonomyValue 
    , Data.CategoryValue 
    , Data.CategoryLevel 
FROM 
    @DataTable as Data 
FOR XML EXPLICIT 

生成XML

<Taxonomy> 
    <Category Level="1">Clothing</Category> 
    <Category Level="2">Jeans</Category> 
</Taxonomy> 

編輯:逆轉只好列。沒有更多的牛仔褲水平。

+0

我曾考慮過使用XML Explicit,但我通常試圖避免它,因爲它非常困難,大部分時間XML Path都會完成這項工作。但是這當然有用,謝謝! – J3FFK

0

我有另外一種方法。這對我來說似乎有點容易。 說,例如我有一個像

DECLARE @xml xml='<parameters></parameters>' 

DECLARE @multiplenodes XML = '<test1><test2 Level="1">This is a test node 2</test2><test2 Level="2">This is another test node</test2></test1>' 

SET @xml.modify('insert sql:variable("@multiplenodes") into (/parameters)[1]') 

SELECT @xml 

一個xml一定要告訴我,如果這有助於。

+0

謝謝,但這不會將TEST2元素更改爲TEST元素。換句話說,你的例子已經有了正確的相同的列名和元素名。在我的示例中,Category1和Category2需要更改爲Category。你有任何想法,如果這是可能的使用xml.modify? – J3FFK

+0

我沒有得到你想說的話。你需要自動創建關卡還是什麼? – vstandsforvinay

+0

元素Category1和Category2需要成爲Category元素。它們是用sql select生成的,通過xml路徑轉換爲xml。 Evere列必須是唯一的,並且每個元素都是唯一的,但是我需要Category元素名稱相同。希望我這樣解釋它。謝謝! – J3FFK

1

我知道這是一箇舊帖子,但我想分享一個解決方案,以避免FOR XML EXPLICIT命令對大xml的複雜性。

這足以補充null作爲分類學的孩子,錯誤將消失:

select 1 as 'Taxonomy/Category/@Level', 
      t.MainCat as 'Taxonomy/Category', 
      NULL AS 'Taxonomy/*', 
      2 as 'Taxonomy/Category/@Level', 
      t.SubCat as 'Taxonomy/Category', 
    from t 

我希望它能幫助。

相關問題