2015-06-19 112 views
2

我想要一個逗號分隔的字段。該結構看起來非常類似於下面的結構。我想爲下面的所有節點獲取以逗號分隔的列表。TSQL XML逗號分隔列表

DECLARE @Test XML = ' 

    <Order id="orderId"> 
     <Products> 
     <Product>1</Product> 
     <Product>2</Product> 
     <Product>3</Product> 
     <Product>4</Product> 
     <Product>5</Product> 
     </Products> 
     <Address street="1234 City World" zip="12345" city="City" state="FL"></Address> 
</Order>' 

SELECT 
    @Test.value('(/Order/@id)[1]', 'NVARCHAR(1000)') AS OrderId, 
    @Test.value('(/Order/Address/@street)[1]', 'NVARCHAR(1000)') AS Street, 
    @Test.value('(/Order/Address/@city)[1]', 'NVARCHAR(1000)') AS City, 
    @Test.value('(/Order/Address/@state)[1]', 'NVARCHAR(1000)') AS State, 
    @Test.value('(/Order/Address/@zip)[1]', 'NVARCHAR(1000)') AS Zip, 
    @Test.query('Order/Products/Product/text()') AS prods 

我得到的那些:

「訂單ID」 爲的OrderId 「1234世界城市」 街道 「城市」 城市 「FL」 的國家 「1245」 的郵編。 「12345」for Prods。

我想獲得「1,2,3,4,5」刺激物。

感謝,

回答

1

我能達到你期望通過這樣的結果:

SELECT @Test.value('(/Order/@id)[1]', 'NVARCHAR(1000)') AS OrderId , 
     @Test.value('(/Order/Address/@street)[1]', 'NVARCHAR(1000)') AS Street , 
     @Test.value('(/Order/Address/@city)[1]', 'NVARCHAR(1000)') AS City , 
     @Test.value('(/Order/Address/@state)[1]', 'NVARCHAR(1000)') AS State , 
     @Test.value('(/Order/Address/@zip)[1]', 'NVARCHAR(1000)') AS Zip , 
     (SELECT  
      STUFF((SELECT ',' + Prods.Prod.value('text()[1]','varchar(max)') 
        FROM @Test.nodes('/Order/Products/Product') AS Prods (Prod) 
        FOR XML PATH('') 
      ), 1, 1, '') 
     ) prods 

這是一種混亂,但我做的是選擇產品節點,並將其轉換爲產品的「表」,然後我使用FOR XMLSTUFF以便在同一行連接它們。

STUFF函數不適用於較早版本的SQL Server,因此您可能需要修改此解決方案,如果需要,您可以嘗試this answer

我希望它有幫助。

+0

謝謝!有效!! – Sam