Анализ XML из столбца таблицы SQL - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть столбец XML в таблице для анализа. Это образец данных в этом столбце:

<product displaygtin="08858011802159" >

/* First Block */

<identification>
    <attributeList>
      <attribute name="gpcSegment">
        <value>Food/Beverage/Tobacco</value>
      </attribute>
    </attributeList>

/* Second Block */ 

</identification>
  <itemCertification>
    <nutrition>
      <attributeList>
        <attribute name="foodLabelVersion">
          <value>P2017</value>
        </attribute>
       </attributeList>
</nutrition>

/*Last Block*/

<certification>
      <attributeList>
        <attribute name="claimKosher">
          <value>false</value>
        </attribute>
      </attributeList>
    </certification>
  </itemCertification>

</product>

Из первого блока я могу легко извлечь, но во втором и последнем блоке я не получаю никакого результата, пожалуйста, кто-то заглянет в запрос ниже и посоветует, каквыписка из других блоков

SELECT [BundleID]
      ,[XML]
      ,[DisplayGTIN]
      ,b.x.value('.', 'VARCHAR(MAX)') AS "Division"
 FROM 
     [ItemCert_Reporting].[dbo].[Retailer_Extract] AS t1
 CROSS APPLY 
     t1.[XML].nodes('product/identification/attributeList/attribute') AS b(x)
 WHERE 
     displaygtin LIKE '%8858011802159'
     AND b.x.value('@name', 'VARCHAR(MAX)') = 'gpcSegment'

1 Ответ

0 голосов
/ 08 ноября 2019

У вас на самом деле есть только два дочерних узла для продукта

  1. идентификация
  2. itemCertification

Ваше выражение XPath действительно только для первого.

Как уже упоминалось в комментариях, не совсем ясно, каков ожидаемый результат, но это может быть то, что вы ищете

  create table #Product (Product XML)

insert into #Product values (
'<product displaygtin="08858011802159">
    <identification>
        <attributeList>
            <attribute name="gpcSegment">
                <value>Food/Beverage/Tobacco</value>
            </attribute>
        </attributeList>
    </identification>
    <itemCertification>
        <nutrition>
            <attributeList>
                <attribute name="foodLabelVersion">
                    <value>P2017</value>
                </attribute>
            </attributeList>
        </nutrition>
        <certification>
            <attributeList>
                <attribute name="claimKosher">
                    <value>false</value>
                </attribute>
            </attributeList>
        </certification>
    </itemCertification>
</product>')



select * from 
(select 
       pref.value('(text())[1]', 'varchar(32)') as Attributes
from 
       #Product CROSS APPLY
       Product.nodes('//attributeList/attribute/value') AS Roles(pref)
)  as Result


drop table #Product
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...