我已经尝试了与该主题相关的 SO 线程的所有建议,但仍然没有得到我需要的。我有一个名为 SC
的 XML 列.这是在 SQL Server 2014 上(以防万一)。表中只有一行,XML数据在SC
列包含以下片段...
<SC_ROOT>
<COMPONENTS>
<COMPONENT>
<NAME>Status A Detection</NAME>
<PROPERTIES>
<COMP_ENABLED>True</COMP_ENABLED>
</PROPERTIES>
</COMPONENT>
...
</COMPONENTS>
</SC_ROOT>
我想用 <NAME>
返回一个表和 <COMP_ENABLED>
仅适用于 <NAME>
包含“检测”。如果已经有一个很好的例子,请指出我吗?提前致谢!
最佳答案
试试这个:
SELECT
Name = xc.value('(NAME)[1]', 'varchar(50)'),
CompEnabled = xc.value('(PROPERTIES/COMP_ENABLED)[1]', 'varchar(10)')
FROM
dbo.YourTable
CROSS APPLY
SC.nodes('/SC_ROOT/COMPONENTS/COMPONENT') AS XT(XC)
WHERE
xc.value('(NAME)[1]', 'varchar(50)') LIKE '%Detection'
.nodes()
调用基本上返回一个带有表别名的“虚拟表”XT
其中有一列(别名 XC
)包含对应于 XPath 表达式的 XML 片段 - 基本上是 <COMPONENT>
XML 片段。你伸手去提取你需要的详细信息
更新:如果您的 XML 如下所示:
<COMPONENT>
<NAME>Status A Detection</NAME>
<PROPERTIES NAME="COMP_ENABLED" VALUE="True" />
</COMPONENT>
然后使用这段代码得到结果:
SELECT
Name = xc.value('(NAME)[1]', 'varchar(50)'),
CompEnabled = xc.value('(PROPERTIES[@NAME="COMP_ENABLED"]/@VALUE)[1]', 'varchar(10)')
FROM
dbo.YourTable
CROSS APPLY
SC.nodes('/SC_ROOT/COMPONENTS/COMPONENT') AS XT(XC)
WHERE
xc.value('(NAME)[1]', 'varchar(50)') LIKE '%Detection'
关于sql - 从 SQL Server 表中查询 XML 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35701321/