#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, ",")
(Возможно, вам потребуется адаптировать начало выражения пути в зависимости от того, как вы читаете свои входные данные)