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

Я получаю те:

"OrderID" для OrderId "1234 City World" для улицы "Сити" Для города "FL" для государства "1245" для Zip. "12345" для 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 XML и STUFF, чтобы объединить их в одну строку.

Функция STUFF не работает в старых версиях SQL Server, поэтому, возможно, вам придется адаптировать это решение, вы можете попробовать this answer в случае необходимости.

Надеюсь, это поможет.

+0

Спасибо! Это сработало!! – Sam