Как обработать большой XML-файл и выбрать данные из него в T-SQL - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть параметр XML со следующей структурой

<?xml version="1.0" encoding="utf-16"?>
<ContactsGET xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <data>
        <Datum>
            <Owner>
                 <name>dilip.nair</name>
                 <id>3565223000000178021</id>
            </Owner>
            <Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
            <Full_Name>Sridhar Vembu</Full_Name>
            <name>Abcon Group</name>
            <id>3565223000000206007</id>
        </Datum>
        <Datum>
            <Owner>
                 <name>dilip.nair</name>
                 <id>3565223000000178021</id>
            </Owner>
            <Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
            <Full_Name>Sridhar Vembu</Full_Name>
            <name>Abcon Group</name>
            <id>3565223000000206007</id>
        </Datum>
    </data>
    <info>
         <per_page>200</per_page>
         <count>200</count>
         <page>1</page>
         <more_records>true</more_records>
    </info>
</ContactsGET>

В T-SQL я пытаюсь обработать каждую запись под тегом Datum в XML.

SELECT 
    [TABLE].[ROW].value('Datum[1]','VARCHAR(4000)') 
FROM
    @pXMLGetContact.nodes('ContactsGET/data') AS [TABLE]([ROW]) 

SELECT @pXMLGetContact;

Но набор результатов возвращает только первую запись.Логика алгоритма заключается в вставке всей информации в переменную таблицы или во временную таблицу и последующей обработке каждой записи по одной.У меня есть некоторая бизнес-логика для реализации записи за записью, как я могу выбрать весь набор записей.

Я использую Azure SQL в качестве сервера.

1 Ответ

0 голосов
/ 05 декабря 2018

Предполагая, что ваш XML находится в переменной с типом XML, вы можете попробовать это:

DECLARE @xml XML=
N'<ContactsGET xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <data>
    <Datum>
      <Owner>
        <name>dilip.nair</name>
        <id>3565223000000178021</id>
      </Owner>
      <Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
      <Full_Name>Sridhar Vembu</Full_Name>
      <name>Abcon Group</name>
      <id>3565223000000206007</id>
    </Datum>
    <Datum>
      <Owner>
        <name>dilip.nair</name>
        <id>3565223000000178021</id>
      </Owner>
      <Email xsi:type="xsd:string">mail2vembu@mail.com</Email>
      <Full_Name>Sridhar Vembu</Full_Name>
      <name>Abcon Group</name>
      <id>3565223000000206007</id>
    </Datum>
  </data>
  <info>
    <per_page>200</per_page>
    <count>200</count>
    <page>1</page>
    <more_records>true</more_records>
  </info>
</ContactsGET>'

- запрос выберет значения <info> непосредственно из XML, как кажется, когда-топо XML.Значения в пределах <data> выбираются .nodes(), но на один уровень глубже, чем вы сами пробовали (повторяющийся элемент - <Datum>):

SELECT @xml.value('(/ContactsGET/info/per_page/text())[1]','int') Info_PerPage
      ,@xml.value('(/ContactsGET/info/count/text())[1]','int') Info_Count
      ,@xml.value('(/ContactsGET/info/page/text())[1]','int') Info_Page
      ,@xml.value('(/ContactsGET/info/more_records/text())[1]','bit') Info_MoreRecords
      ,dat.value('(Owner/name/text())[1]','nvarchar(max)') Owner_name
      ,dat.value('(Owner/id/text())[1]','nvarchar(max)') Owner_id
      ,dat.value('(Email/text())[1]','nvarchar(max)') eMail
      ,dat.value('(Full_Name/text())[1]','nvarchar(max)') Full_Name
      ,dat.value('(name/text())[1]','nvarchar(max)') [Name]
      ,dat.value('(id/text())[1]','nvarchar(max)') id
FROM @xml.nodes('/ContactsGET/data/Datum') A(dat);
...