Выберите из XML-запроса

#sql-server #xml #tsql

#sql-сервер #xml #tsql

Вопрос:

Я ищу, я не уверен в синтаксисе для ссылки на поле массива. Пожалуйста, кто-нибудь может мне помочь?

Ответ №1:

Вы можете попробовать это:

 DECLARE @data XML = '--your--XML--here';

SELECT
    XC.value('(FLD[@NM="TOTAL POLICY PREM"])[1]', 'decimal(16,2)'),
    XC2.value('(./@NM)[1]', 'varchar(50)'),
    XC2.value('(ARRAYVALUE)[2]', 'varchar(20)')
FROM
    @data.nodes('/POLOUTPUTS') AS XT(XC)
CROSS APPLY
    xc.nodes('FLDARRAY') AS XT2(XC2)
WHERE
    XC2.value('(./@NM)[1]', 'varchar(50)') = 'PAY PLAN POLI PREM ARR'
 

Первый .nodes() вызов возвращает список фрагментов XML для каждого <POLOUTPUTS> элемента, из которого вы можете извлечь значение <FLD> со значением TOTAL POLICY PREM атрибута.

Второй, вложенный .nodes() вызов возвращает список фрагментов XML для каждого <FLDARRAY> элемента внутри <POLOUTPUTS> элемента — и из этого вы можете извлечь значение NM атрибута (для сравнения в WHERE предложении) и значение второго <ARRAYVALUE> элемента внутри него.

Ответ №2:

 declare @x xml = N'<POLOUTPUTS>
      <FLD NM="MAXIMUM DRIVER AGE">43.59</FLD>
............
      <FLD NM="RED MOUNTAIN SCORE MAX">735</FLD>
      <FLD NM="TOTAL POLICY PREM">1678.37</FLD>
      <FLD NM="VEH MIN BI IND" />
      <FLDARRAY NM="PAY PLAN DESCR ARR">
.............
        <ARRAYVALUE>0</ARRAYVALUE>
      </FLDARRAY>
      <FLDARRAY NM="PAY PLAN POLI PREM ARR">
        <ARRAYVALUE>1678.37</ARRAYVALUE>
        <ARRAYVALUE>1621.54</ARRAYVALUE>
        <ARRAYVALUE>1635.74</ARRAYVALUE>
...............
        <ARRAYVALUE>0</ARRAYVALUE>
    </FLDARRAY>
</POLOUTPUTS>'


select 
    @x.value('(POLOUTPUTS/FLD[@NM="TOTAL POLICY PREM"])[1]', 'decimal(9,2)'),
    @x.value('(POLOUTPUTS/FLDARRAY[@NM="PAY PLAN POLI PREM ARR"]/ARRAYVALUE[2])[1]', 'decimal(9,2)');
 

Комментарии:

1. Я ценю это. Спасибо.