MS SQL Server - OpenXML - 多个元素

时间:2018-02-05 08:49:44

标签: sql-server xml openxml sql-server-openxml

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?

1 个答案:

答案 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  

您将获得所需的输出。