代码之家  ›  专栏  ›  技术社区  ›  chaika_sv

MS SQL Server-OpenXML-多元素

  •  2
  • chaika_sv  · 技术社区  · 7 年前

    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>
    

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   PSK    7 年前

    为什么不使用本机 XQuery 提供的支持 SQL Server . OpenXML 年纪大了,有很多问题。

    您可以使用以下命令编写查询 函数 支持

    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  
    

    您将获得所需的输出。