Создание XML-схемы для массовой загрузки в SQL Server — дочерний элемент описывает родительский

У меня есть документ XML, для которого я работаю над созданием схемы, чтобы массово загружать эти документы в таблицу SQL Server. XML, на котором я сосредоточусь, выглядит так:

<Coverage>
    <CoverageCd>BI</CoverageCd>
    <CoverageDesc>BI</CoverageDesc>
    <Limit>
        <FormatCurrencyAmt>
            <Amt>30000.00</Amt>
        </FormatCurrencyAmt>
        <LimitAppliesToCd>PerPerson</LimitAppliesToCd>
    </Limit>
    <Limit>
        <FormatCurrencyAmt>
            <Amt>85000.00</Amt>
        </FormatCurrencyAmt>
        <LimitAppliesToCd>PerAcc</LimitAppliesToCd>
    </Limit>
</Coverage>
<Coverage>
    <CoverageCd>PD</CoverageCd>
    <CoverageDesc>PD</CoverageDesc>
    <Limit>
        <FormatCurrencyAmt>
            <Amt>50000.00</Amt>
        </FormatCurrencyAmt>
        <LimitAppliesToCd>Coverage</LimitAppliesToCd>
    </Limit>
</Coverage>

Внутри элемента Limit есть дочерний элемент LimitAppliesToCd, который мне нужно использовать, чтобы определить, где в моей таблице на самом деле хранится значение элемента Amt. Возможно ли это сделать с помощью стандартной функции массовой загрузки XML в SQL Server? Обычно в XML я ожидаю, что элемент будет иметь атрибут, содержащий информацию «PerPerson» или «PerAcc», но используемый нами стандарт не требует этого.

Если кто-то раньше работал со стандартом ACORD, возможно, вы знаете, с чем я здесь работаю. Любая помощь приветствуется.


person B. Hanson    schedule 11.08.2016    source источник
comment
Этот вопрос решен? Вам нужна дополнительная помощь? Пожалуйста, позвольте мне одну подсказку: было бы очень любезно с вашей стороны поставить галочку напротив счетчика голосов за лучший ответ. Это 1) пометит эту проблему как решенную 2) подписчикам будет легче найти лучшее решение 3) заплатит баллы отвечающему и 4) заплатит баллы вам. После того, как вы сами пересекли границу в 15 баллов, вас дополнительно попросят проголосовать за вклад. Это ТАК-способ сказать спасибо. Удачного кодирования!   -  person Shnugo    schedule 18.08.2016


Ответы (1)


Не знаю точно, о чем вы говорите, но это решение для получения информации из вашего XML.

Предположение: ваш XML уже загружен в объявленную переменную @xml типа XML:

CTE извлечет информацию из вашего XML. Окончательный запрос будет использовать PIVOT, чтобы поместить ваши данные в правый столбец.

Со структурой подгоночной таблицы фактическая вставка должна быть простой...

WITH DerivedTable AS
(
    SELECT cov.value('CoverageCd[1]','varchar(max)') AS CoverageCd
          ,cov.value('CoverageDesc[1]','varchar(max)') AS CoverageDesc
          ,lim.value('(FormatCurrencyAmt/Amt)[1]','decimal(14,4)') AS Amt
          ,lim.value('LimitAppliesToCd[1]','varchar(max)') AS LimitAppliesToCd
    FROM @xml.nodes('/root/Coverage') AS A(cov)
    CROSS APPLY cov.nodes('Limit') AS B(lim)
)
SELECT p.*
FROM
(SELECT * FROM DerivedTable) AS tbl
PIVOT
(
    MIN(Amt) FOR LimitAppliesToCD IN(PerPerson,PerAcc,Coverage)
) AS p
person Shnugo    schedule 12.08.2016