【问题标题】:Select value from XML node where conditions are met从满足条件的 XML 节点中选择值
【发布时间】:2017-05-18 09:36:52
【问题描述】:

我有以下要查询的 xml 以转换为平面表结构。

<RiskBoundReportProcess>
    <RiskBoundReport>
        <Policy key="Pol126446">
            <LineOfBusinessCode>ISR</LineOfBusinessCode>
            <AssignedIdentifier>
                <RoleCode>Insured</RoleCode>
                <Id>BP-1438</Id>
            </AssignedIdentifier>
            <RiskParticipationPercentIndicator>true</RiskParticipationPercentIndicator>
            <PolicySection>
                <PolicyProducer>
                    <RoleCode>Coverholder</RoleCode>
                    <Producer>
                        <OrganizationReferences organizationReference="Coverholder"/>
                    </Producer>
                </PolicyProducer>
                <PolicyProducer>
                    <RoleCode>Underwriter</RoleCode>
                    <Producer>
                        <Contact>
                            <PersonReferences>
                                <PersonName>
                                    <FullName>Name</FullName>
                                </PersonName>
                            </PersonReferences>
                        </Contact>
                    </Producer>
                </PolicyProducer>
                <PolicyProducer>
                    <RoleCode>Broker</RoleCode>
                    <AssignedIdentifier>
                        <RoleCode>Broker</RoleCode>
                        <Id>112</Id>
                    </AssignedIdentifier>
                    <Producer>
                        <OrganizationReferences organizationReference="BrokerOrg112"/>
                    </Producer>
                </PolicyProducer>
                <PolicyProducer>
                    <RoleCode>LondonBroker</RoleCode>
                    <ProducerReferences producerReference="Binder1">
                        <ExternalIdentifier>
                            <TypeCode>UniqueMarketReference</TypeCode>
                            <Id>UMRGoesHere</Id>
                        </ExternalIdentifier>
                        <OrganizationReferences>
                            <OrganizationName>
                                <FullName>Partners Ltd</FullName>
                            </OrganizationName>
                        </OrganizationReferences>
                        <BindingAuthorityPeriod>
                            <StartDate>2014-05-01</StartDate>
                            <EndDate>2015-04-30</EndDate>
                        </BindingAuthorityPeriod>
                    </ProducerReferences>
                    <RiskParticipationPercent>1.0000</RiskParticipationPercent>
                </PolicyProducer>
            </PolicySection>
        </Policy>
    </RiskBoundReport>
</RiskBoundReportProcess>

到目前为止,我有两列。我现在想为以下节点中的 UniqueMarketReference 创建一个列

RiskBoundReportProcess/RiskBoundReport/Policy/PolicySection/PolicyProducer[RoleCode="LondonBroker"]/ProducerReferences/ExternalIdentifier/[TypeCode="UniqueMarketReference"]/Id

如何修改下面的 SQL 以包含它?

SELECT
    Policy.value('@key', 'VARCHAR(50)') AS PolicyId,
    Policy.value('LineOfBusinessCode[1]', 'VARCHAR(50)') AS LineOfBusinessCode
FROM @ACORDXML.nodes('/RiskBoundReportProcess/RiskBoundReport') AS RiskBoundReport(Nodes)

CROSS APPLY RiskBoundReport.Nodes.nodes('Policy') AS Policies(Policy)

我最终也会将 The Insured、Coverholer 和 Underwriter 作为专栏返回。

【问题讨论】:

    标签: sql-server xml tsql xpath xquery


    【解决方案1】:

    您非常接近...您提供的XPath[TypeCode ...] 之前只有一个/,这太多了。

    试试这样:

    SELECT
        Policy.value(N'@key', N'VARCHAR(50)') AS PolicyId
       ,Policy.value(N'LineOfBusinessCode[1]', N'VARCHAR(50)') AS LineOfBusinessCode
       ,Policy.value(N'(/RiskBoundReportProcess/RiskBoundReport/Policy/PolicySection
                       /PolicyProducer[RoleCode="LondonBroker"]
                       /ProducerReferences/ExternalIdentifier[TypeCode="UniqueMarketReference"]/Id/text())[1]','VARCHAR(50)') AS LondonBroker
       ,Policy.value(N'(/RiskBoundReportProcess/RiskBoundReport/Policy/PolicySection
                       /PolicyProducer[RoleCode="Underwriter"]
                       /Producer/Contact/PersonReferences/PersonName/FullName/text())[1]','VARCHAR(50)') AS Underwriter
    FROM @ACORDXML.nodes('/RiskBoundReportProcess/RiskBoundReport') AS RiskBoundReport(Nodes)
    CROSS APPLY RiskBoundReport.Nodes.nodes('Policy') AS Policies(Policy);
    

    您的某些节点看起来与1:n 相关(&lt;PersonReferences&gt;&lt;PersonName&gt;...)。这可能需要一些额外的努力 (.nodes())...

    【讨论】:

    • @Bizarrefish,很高兴为您提供帮助,祝您编码愉快!
    猜你喜欢
    • 2017-10-22
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    相关资源
    最近更新 更多