首页 > 解决方案 > 将 XML 键值对转换为字符串

问题描述

我有这个查询:

SELECT 
    XMLColumn.i.query('.') AS XMLColumn, 
    ID
FROM
    MyTable
CROSS APPLY 
    MyTable.XMLColumn.nodes('Root/Fields') AS Col(i)

返回此结果:

╔═════════════════════════╦════╗
║        XMLColumn        ║ ID ║
╠═════════════════════════╬════╣
║ <Fields>                ║  1 ║
║   <Field>               ║    ║
║     <Name>First</Name>  ║    ║
║     <Value>1</Value>    ║    ║
║   </Field>              ║    ║
║   <Field>               ║    ║
║     <Name>Second</Name> ║    ║
║     <Value>2</Value>    ║    ║
║   </Field>              ║    ║
║   <Field>               ║    ║
║     <Name>Third</Name>  ║    ║
║     <Value>3</Value>    ║    ║
║   </Field>              ║    ║
║ </Fields>               ║    ║
╚═════════════════════════╩════╝

有没有办法将此 XML 结构转换为以下字符串格式?

╔══════════════════════════╦════╗
║        XMLColumn         ║ ID ║
╠══════════════════════════╬════╣
║ First=1;Second=2;Third=3 ║  1 ║
╚══════════════════════════╩════╝

标签: sql-serverxmltsqlxquery

解决方案


这是一种纯 XQuery 方法

DECLARE @x XML = 
N'<Fields>
   <Field>
      <Name>First</Name>
      <Value>1</Value>
   </Field>
   <Field>
      <Name>Second</Name>
      <Value>2</Value>
   </Field>
   <Field>
      <Name>Third</Name>
      <Value>3</Value>
   </Field>
</Fields>';

- 查询

SELECT STUFF(
@x.query
('
    for $fld in /Fields/Field
    return <x>{concat(";"
                     ,($fld/Name/text())[1]
                     ,"="
                     ,($fld/Value/text())[1])
               }</x>
').value('.','nvarchar(max)'),1,1,'');

简而言之:

我们遍历所有字段并创建这种格式的全新 XML

<x>;First=1</x>
<x>;Second=2</x>
<x>;Third=3</x>

使用as XPath.value()会将.整个内容(不包括标签)作为字符串返回。STUFF()用于切除前导;


推荐阅读