#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. Я ценю это. Спасибо.