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>所以问题是我怎样才能得到两行风险?
发布于 2018-02-05 09:07:25
为什么不使用由XQuery Server提供的本机支持。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 您将得到所需的输出。
https://stackoverflow.com/questions/48618689
复制相似问题