Извлечение данных из документа XML в таблицу SQL, пустую таблицу при использовании OPENROWSET для извлечения атрибута из XML - PullRequest
1 голос
/ 01 мая 2019

Мне нужно вставить атрибуты из файла XML в таблицу SQL. Я бродил по Stackoverflow, чтобы найти решение, но ничего, что я пробовал, похоже, не работает.

Я пробовал с и без определения и использования пространства имен, а также всевозможных комбинаций путей к узлам для навигации по XML.

Вот часть Xml, из которой я хотел бы получить атрибуты:

``<export xmlns="http://www.arcticgroup.se/tariff/arctictariff/export" xmlns:at="http://www.arcticgroup.se/tariff/arctictariff/export" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.arcticgroup.se/tariff/arctictariff/export GoodsNomenclature.xsd ">
  <id>e37c6378-892a-4c25-b3fe-d0f3fcdf5a29</id>
  <exportType>GoodsNomenclatureObject</exportType>
  <parameters />
  <items>
    <goodsNomenclature at:goodsNomenclatureCode="0101109090" at:dateEnd="2011-06-30" at:national="0" at:productLineSuffix="80" at:SID="74778" at:dateStart="2002-01-01" at:statisticalIndicator="0" at:changeType="U">
      <goodsNomenclatureIndent at:national="0" at:quantityIndents="03" at:SID="74084" at:dateStart="2002-01-01" />
      <goodsNomenclatureDescriptionPeriod at:national="0" at:SID="92833" at:dateStart="2002-01-01">
        <goodsNomenclatureDescription at:description="andere" at:languageId="NL" at:national="0" />
        <goodsNomenclatureDescription at:description="Other" at:languageId="EN" at:national="0" />
      </goodsNomenclatureDescriptionPeriod>
    </goodsNomenclature>
  </items>
</export>``

Это последний код, который я пробовал:

INSERT INTO TblGoodsNomenclature(XMLData, CreatedDate)
SELECT Convert(Xml, BulkColumn) as BulkColumn, GETDATE()
FROM OPENROWSET(Bulk '\\shareapp\c$\temp\GoodsNomenclature.xml', Single_Blob) as x;

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

SELECT @XML = XmlData FROM TblGoodsNomenclature

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML, '<export xmlns="http://www.arcticgroup.se/tariff/arctictariff/export" xmlns:at="http://www.arcticgroup.se/tariff/arctictariff/export"/>'

INSERT INTO NomenclatureCodes (NomenclatureCode, Description, DescriptionLanguage)
SELECT NomenclatureCode, Description, DescriptionLanguage
    FROM OPENXML(@hDoc, '/items/goodsNomenclature/goodsNomenclatureDescriptionPeriod/goodsNomenclatureDescription/at:node')
    WITH 
    (
        NomenclatureCode INT '@at:goodsNomenclatureCode',
        Description [varchar](100) '@at:description',
        DescriptionLanguage [varchar](5) '@at:languageID'

    )

Результат, который я получаю сейчас - это просто пустая таблица, без сообщений об ошибках. То, что я хотел бы иметь, это "goodsNomeclatureCode", "description" и "languageID" в таблице.

1 Ответ

1 голос
/ 01 мая 2019

Как уже упоминалось в комментариях, вам лучше использовать XQUERY здесь.Поскольку у вас также есть несколько пространств имен, мы должны объявить их тоже.Это дает вам следующий запрос:

WITH XMLNAMESPACES (DEFAULT 'http://www.arcticgroup.se/tariff/arctictariff/export',
                    'http://www.arcticgroup.se/tariff/arctictariff/export' AS [at])
SELECT GN.XMLData,
       EI.gN.value('@at:goodsNomenclatureCode[1]','varchar(15)') AS goodsNomenclatureCode
FROM dbo.TblGoodsNomenclature GN
     CROSS APPLY GN.XMLData.nodes('export/items/goodsNomenclature') EI(gN);

db <> fiddle

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