XML示例:
<POLICY>
<RISKS>
<RISK>
<DRV>1</DRV>
</RISK>
<RISK>
<DRV>2</DRV>
</RISK>
</RISKS>
</POLICY>
我想用这个查询选择两个Risk元素:
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>
所以问题是如何获得两个Risk-rows?
答案 0 :(得分:3)
为什么不使用 SQL Server 提供的原生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
您将获得所需的输出。