sql-server - 将 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 ║
╚══════════════════════════╩════╝
解决方案
这是一种纯 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()
用于切除前导;
。
推荐阅读
- reactjs - 在反应中将卡片的内容从一页传递到另一页
- javascript - JavaScript/Express Promise.all() 问题
- here-api - 逐向导航中的测量单位
- flutter - 如何为大型项目编写 injection_container(服务注入器)
- python - tesseract-ocr个位数识别如何提高?
- flutter - Flutter - 如何隐藏全局底部导航栏?
- gremlin - 如何在 Amazon Neptune 中使用 gremlin 计算 PageRank 和最短路径算法?
- angular - Angular-Ionic:视频标签中的视频之间的无缝过渡?
- reactjs - 材质 ui 中的 ScopedCssBaseline 覆盖组件的 box-sizing
- sql - 多个插入/更新的 SQL 前缀