sql-server - 如何从具有不同节点的 XML 中获取数据作为 SQL Server 中的列
问题描述
我有一个 XML,我试图从 XML 中按表名选择行,但每个节点上的列数不同。
下面是我的 XML:
<tables>
<table>
<name>Table1</name>
<attr>
<id>1</id>
<col1>123</col1>
<col2>345</col2>
</attr>
<attr>
<id>2</id>
<col3>123</col3>
</attr>
<attr>
<id>4</id>
<col2>123</col2>
</attr>
</table>
</tables>
现在我通过以下查询进行查询:
SELECT T.N.VALUE('id','nvarchar(100)') as id,
T.N.VALUE('col1','nvarchar(100)') as col1,
T.N.VALUE('col2','nvarchar(100)') as col2,
T.N.VALUE('col3','nvarchar(100)') as col3
FROM @input.nodes('/tables/table/attr') AS T(N)
CROSS APPLY @input.nodes('/tables/table/name') AS S(N)
WHERE S.N.value('name','varchar(100)')='Table1'
但我得到一个错误
XQuery [value()]: 'value()' 需要一个单例(或空序列),找到类型为 'xdt:untypedAtomic *' 的操作数
但我期望得到:
id | col1 | col2 | col3
---+------+------+------
1 | 123 | 345 | NULL
2 | NULL | NULL | 123
4 | NULL | 123 | NULL
解决方案
像这样:
declare @input xml = '<tables>
<table>
<name>Table1</name>
<attr>
<id>1</id>
<col1>123</col1>
<col2>345</col2>
</attr>
<attr>
<id>2</id>
<col3>123</col3>
</attr>
<attr>
<id>4</id>
<col2>123</col2>
</attr>
</table>
</tables>
'
SELECT a.N.value('(id)[1]','nvarchar(100)') as id,
a.N.value('(col1)[1]','nvarchar(100)') as col1,
a.N.value('(col2)[1]','nvarchar(100)') as col2,
a.N.value('(col3)[1]','nvarchar(100)') as col3
FROM @input.nodes('/tables/table') AS t(N)
CROSS APPLY T.N.nodes('attr') AS a(N)
WHERE t.N.value('(name)[1]','varchar(100)')='Table1'
推荐阅读
- c - C 单元测试 - 模拟(在检查框架中)
- oracle - 将 http/listener 端口分配给 oracle 说无效
- python - Keras.backend.gradients 给出无而不是零
- bash - 使用 bash 在另一个文件的中间插入文件内容
- reactjs - 无法使用 Formik 和 Material UI 渲染表单
- tcl - 如何在 TCL 解释器中检索最后一个命令的返回值?
- mxgraph - 用 mxgraph 部分填充一个矩形
- android - 此效果的名称/如何重现它
- twilio - 我从 Twilio 神秘地收到 11200 错误(403 Forbidden on callback)
- r - 创建一个显示按年份发布的项目数量的图