2015-06-19 114 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