Home Forums SQL Server 7,2000 T-SQL What is the best way to iterate XML elements in SQL? RE: What is the best way to iterate XML elements in SQL?

  • You're going to want to use a combination of CROSS (or OUTER) APPLY to turn the multiple nodes inside of some of the hierarchies into a virtual table of sorts. Note - you want to structure the APPLY statement to land at the "top" of the subtrees you plan on iterating through.

    Something like the follow (note I added a few ID columns for testing purposes):

    declare @xml XML

    set @xml='<output xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PublishPricingRule.xsd" scenario="PublishPricingRule" sourceSystem="Pricing" eventType="Persist" transactionID="2012-06-26T13:46:52.064">

    <pricingRuleCollection id="1">

    <pricingRule id="3" >

    <pricingInstruction precedenceIndex="1314">

    <hierarchyNodeInclusionQualifier precedenceIndex="1315">

    <includedHierarchyNodes />

    </hierarchyNodeInclusionQualifier>

    <hierarchyNodeExclusionQualifier precedenceIndex="1316">

    <excludedHierarchyNodes />

    </hierarchyNodeExclusionQualifier>

    <mediaInclusionQualifier />

    <mediaExclusionQualifier />

    <brandInclusionQualifier precedenceIndex="1317" />

    <brandExclusionQualifier precedenceIndex="1318" />

    <monetaryHurdleRangeQualifier precedenceIndex="1319">

    <range lower="0.0" upper="9999.99" />

    </monetaryHurdleRangeQualifier>

    <shippingServiceInclusionQualifier precedenceIndex="1320">

    <qualifyingShippingServices>

    <qualifyingShippingService value="APO/FPO-Std" />

    <qualifyingShippingService value="Catalog Desk Continental" />

    <qualifyingShippingService value="Continental-Std" />

    </qualifyingShippingServices>

    </shippingServiceInclusionQualifier>

    <creditCardInclusionQualifier precedenceIndex="1321">

    <qualifyingCreditCards>

    <qualifyingCreditCard name="Amex" />

    <qualifyingCreditCard name="Visa" />

    </qualifyingCreditCards>

    </creditCardInclusionQualifier>

    <directShipInclusionQualifier precedenceIndex="1322" />

    <dropShipInclusionQualifier precedenceIndex="1323" />

    <proportionalShippingFeeAdjuster adjustmentAmount="0.00" />

    </pricingInstruction>

    </pricingRule>

    </pricingRuleCollection>

    </output>'

    select @xml

    select r.value('(/output/@scenario)[1]','varchar(250)'),

    r.value('(/output/pricingRuleCollection/@id)[1]','varchar(250)'),

    r.value('(/output/pricingRuleCollection/pricingRule/@id)[1]','varchar(250)'),

    r.value('(/output/pricingRuleCollection/pricingRule/pricingInstruction/@precedenceIndex)[1]','int')

    ,s.value('@value','varchar(100)')

    from @xml.nodes('/') x(r)

    cross apply r.nodes('output/pricingRuleCollection/pricingRule/pricingInstruction') l(h)

    cross apply h.nodes('shippingServiceInclusionQualifier/qualifyingShippingServices/qualifyingShippingService') o(s)

    ----------------------------------------------------------------------------------
    Your lack of planning does not constitute an emergency on my part...unless you're my manager...or a director and above...or a really loud-spoken end-user..All right - what was my emergency again?