XML 示例:
<POLICY>
<RISKS>
<RISK>
<DRV>1</DRV>
</RISK>
<RISK>
<DRV>2</DRV>
</RISK>
</RISKS>
</POLICY>
我想通过此查询选择两个风险元素:
SELECT RISK
FROM OPENXML(@hDOC, 'POLICY/RISKS', 2)
WITH(
RISK XML 'RISK'
) AS Z
预期:
1. <RISK><DRV>1</DRV></RISK>
2. <RISK><DRV>2</DRV></RISK>
结果:
1. <RISK><DRV>1</DRV></RISK>
(仅返回第一个元素)
为了进行比较,此查询按预期返回两行:
SELECT DRV
FROM OPENXML(@hDOC, 'POLICY/RISKS/RISK', 2)
WITH(
DRV XML 'DRV'
) AS Z
结果:
1. <DRV>1</DRV>
2. <DRV>2</DRV>
所以问题是如何获得两个风险行?
最佳答案
为什么不使用 SQL Server 提供的 native XQuery
支持。 OpenXML
很旧并且有很多问题。
您可以使用 XQuery
支持编写如下查询
DECLARE @hDOC xml
SET @hDOC='<POLICY>
<RISKS>
<RISK>
<DRV>1</DRV>
</RISK>
<RISK>
<DRV>2</DRV>
</RISK>
</RISKS>
</POLICY>'
SELECT T.c.query('.') AS result
FROM @hDOC.nodes('/POLICY/RISKS/RISK') T(c)
GO
您将得到输出
1. <RISK><DRV>1</DRV></RISK>
2. <RISK><DRV>2</DRV></RISK>
编辑:如果您仍想使用 OpenXml
,请使用如下查询。
DECLARE @DocHandle int
DECLARE @hDOC VARCHAR(1000)
SET @hDOC=N'<POLICY>
<RISKS>
<RISK>
<DRV>1</DRV>
</RISK>
<RISK>
<DRV>2</DRV>
</RISK>
</RISKS>
</POLICY>'
EXEC sp_xml_preparedocument @DocHandle OUTPUT, @hDOC
SELECT RISK
FROM OPENXML(@DocHandle, 'POLICY/RISKS/RISK', 2)
WITH(
RISK XML '.'
) AS Z
EXEC sp_xml_removedocument @DocHandle
您将获得所需的输出。
关于sql-server - MS SQL Server - OpenXML - 多个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48618689/