Получение строки с разделителями из XML с помощью SQL Server 2005 XQuery

#sql-server-2005 #xquery

#sql-server-2005 #xquery

Вопрос:

Кажется, я не могу получить строку с разделителями [запятая] из XML-документа, используя только SQL Server 2005 XQuery.

У меня есть:

 <AAA>
  <Name>Name_A</Name>
  <Value>Val_A</Value>
</AAA>
<AAA>
  <Name>Name_B</Name>
  <Value>Val_B</Value>
</AAA>
<AAA>
  <Name>Name_C</Name>
  <Value>Val_C</Value>
</AAA>
... (etc.)
  

… и хотел бы получить Val_A,Val_B,Val_C... — строку, разделенную запятыми.

Я могу преобразовать в таблицу, а затем обратно в строку с помощью FOR XML, но подумал, что есть прямой способ.

Спасибо.

Ответ №1:

Как насчет этого — это будет работать для любого количества <AAA> узлов в переменной XML:

 DECLARE @Input XML = '<AAA>
  <Name>Name_A</Name>
  <Value>Val_A</Value>
</AAA>
<AAA>
  <Name>Name_B</Name>
  <Value>Val_B</Value>
</AAA>
<AAA>
  <Name>Name_C</Name>
  <Value>Val_C</Value>
</AAA>'

SELECT
    STUFF(
    (SELECT 
        ','   AAA.value('(Value)[1]', 'varchar(20)')
     FROM
        @Input.nodes('/AAA') AS Node(AAA)
     FOR XML PATH('')
    ), 1, 1, '')
  

Вывод:

 Val_A,Val_B,Val_C
  

Комментарии:

1. Ах, я не знал, что добавление строки («,») в XML будет работать, и использовал CTE с тем же запросом .nodes(), чтобы затем выполнить ПУТЬ FOR XML отдельно! Отлично, спасибо.

Ответ №2:

 declare @xml xml = '
<AAA>
  <Name>Name_A</Name>
  <Value>Val_A</Value>
</AAA>
<AAA>
  <Name>Name_B</Name>
  <Value>Val_B</Value>
</AAA>
<AAA>
  <Name>Name_C</Name>
  <Value>Val_C</Value>
</AAA>
'

select @xml.value('(/AAA[1]/Value)[1]', 'varchar(10)') ',' 
       @xml.value('(/AAA[2]/Value)[1]', 'varchar(10)') ',' 
       @xml.value('(/AAA[3]/Value)[1]', 'varchar(10)')
  

Ответ №3:

Как насчет

 string-join(/AAA/Value, ",")
  

(Возможно, вам потребуется адаптировать начало выражения пути в зависимости от того, как вы читаете свои входные данные)