首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenXML -多个元素

OpenXML -多个元素
EN

Stack Overflow用户
提问于 2018-02-05 08:49:44
回答 1查看 487关注 0票数 2

XML示例:

代码语言:javascript
复制
<POLICY>
    <RISKS>
        <RISK>
            <DRV>1</DRV>
        </RISK>
        <RISK>
            <DRV>2</DRV>
        </RISK>
    </RISKS>
</POLICY>

我想用这个查询选择这两个风险元素:

代码语言:javascript
复制
SELECT RISK
FROM OPENXML(@hDOC, 'POLICY/RISKS', 2)
WITH(
    RISK            XML     'RISK'
) AS Z

预期:

代码语言:javascript
复制
1. <RISK><DRV>1</DRV></RISK>
2. <RISK><DRV>2</DRV></RISK>

结果:

代码语言:javascript
复制
1. <RISK><DRV>1</DRV></RISK>

(只返回第一个元素)

比较而言,此查询按预期返回两行:

代码语言:javascript
复制
SELECT DRV
FROM OPENXML(@hDOC, 'POLICY/RISKS/RISK', 2)
WITH(
    DRV         XML     'DRV'
) AS Z

结果:

代码语言:javascript
复制
1. <DRV>1</DRV>
2. <DRV>2</DRV>

所以问题是我怎样才能得到两行风险?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-05 09:07:25

为什么不使用由XQuery Server提供的本机支持。OpenXML已经很老了,而且有很多问题。

您可以使用XQuery支持编写查询,如下所示

代码语言:javascript
复制
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 

您将获得输出,如

代码语言:javascript
复制
1. <RISK><DRV>1</DRV></RISK>
2. <RISK><DRV>2</DRV></RISK>

编辑:如果您还想使用OpenXml,请使用下面的查询。

代码语言:javascript
复制
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  

您将得到所需的输出。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48618689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档