Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как запихнуть в базу подобный XML  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
Ребята, есть XML такой структуры:
Сервер SQL2005.
Файл xml внешний. Можно ли к нему как то обратиться через OPENQUERY и запихнуть в базу.

<?xml version="1.0" encoding="utf-8"?>
<FISC ver="1.0">
  <EJ DevID="56203894">
    <OP_REG Op="1" Nm="           ОПЕРАТОР 1" DT="2012-03-29T15:20:46"/>
    <DOC ZN="56203894" FN="0">
      <C N="11" T="0">
        <P C="2" Nm="ЧАЙ NESTEA 0.5Л" Sm="2.22" Tx="2" TxPr="0.00" SborPr="0.00" TxOff="0"/>
        <P C="1" Nm="COCA-COLA 1Л" Sm="1.11" Tx="1" TxPr="20.00" SborPr="0.00" TxOff="0"/>
        <M T="0" Nm="ГОТIВКА" Sm="3.33"/>
      </C>
      <TS>2012-03-29T15:20:48</TS>
    </DOC>
    <DOC ZN="56203894" FN="0">
      <C N="12" T="0">
        <P C="3" Nm="СОК ДОБРЫЙ 1Л" Sm="3.33" Tx="3" TxPr="0.00" SborPr="0.00" TxOff="0"/>
        <M T="0" Nm="ГОТIВКА" Sm="3.33"/>
      </C>
      <TS>2012-03-29T15:20:50</TS>
    </DOC>
    <DOC ZN="56203894" FN="0">
      <C N="13" T="0">
        <P C="4" Nm="БАТОНЧИК SNIKERS" Sm="4.44" Tx="4" TxPr="0.00" SborPr="0.00" TxOff="0"/>
        <M T="0" Nm="ГОТIВКА" Sm="4.44"/>
      </C>
      <TS>2012-03-29T15:20:52</TS>
    </DOC>
    <DOC ZN="56203894" FN="0">
      <C N="14" T="0">
        <P C="5" Nm="ШОКОЛАДКА КОРОНА" Sm="5.55" Tx="0" TxPr="0.00" SborPr="0.00" TxOff="0"/>
        <M T="0" Nm="ГОТIВКА" Sm="5.55"/>
      </C>
      <TS>2012-03-29T15:20:52</TS>
    </DOC>
    <DOC ZN="56203894" FN="0">
      <C N="15" T="0">
        <P C="6" Nm="NESCAFE CLASSIC 10" Sm="6.66" Tx="1" TxPr="20.00" SborPr="0.00" TxOff="0"/>
        <M T="0" Nm="ГОТIВКА" Sm="6.66"/>
      </C>
      <TS>2012-03-29T15:20:56</TS>
    </DOC>
  </EJ>
</FISC>
Ребята, есть XML такой структуры:

<?xml version="1.0" encoding="utf-8"?>
<FISC ver="1.0">
  <EJ DevID="56203894">
    <OP_REG Op="1" Nm="           ОПЕРАТОР 1" DT="2012-03-29T15:20:46"/>
    <DOC ZN="56203894" FN="0">
      <C N="11" T="0">
        <P C="2" Nm="ЧАЙ NESTEA 0.5Л" Sm="2.22" Tx="2" TxPr="0.00" SborPr="0.00" TxOff="0"/>
        <P C="1" Nm="COCA-COLA 1Л" Sm="1.11" Tx="1" TxPr="20.00" SborPr="0.00" TxOff="0"/>
        <M T="0" Nm="ГОТIВКА" Sm="3.33"/>
      </C>
      <TS>2012-03-29T15:20:48</TS>
    </DOC>
    <DOC ZN="56203894" FN="0">
      <C N="12" T="0">
        <P C="3" Nm="СОК ДОБРЫЙ 1Л" Sm="3.33" Tx="3" TxPr="0.00" SborPr="0.00" TxOff="0"/>
        <M T="0" Nm="ГОТIВКА" Sm="3.33"/>
      </C>
      <TS>2012-03-29T15:20:50</TS>
    </DOC>
    <DOC ZN="56203894" FN="0">
      <C N="13" T="0">
        <P C="4" Nm="БАТОНЧИК SNIKERS" Sm="4.44" Tx="4" TxPr="0.00" SborPr="0.00" TxOff="0"/>
        <M T="0" Nm="ГОТIВКА" Sm="4.44"/>
      </C>
      <TS>2012-03-29T15:20:52</TS>
    </DOC>
    <DOC ZN="56203894" FN="0">
      <C N="14" T="0">
        <P C="5" Nm="ШОКОЛАДКА КОРОНА" Sm="5.55" Tx="0" TxPr="0.00" SborPr="0.00" TxOff="0"/>
        <M T="0" Nm="ГОТIВКА" Sm="5.55"/>
      </C>
      <TS>2012-03-29T15:20:52</TS>
    </DOC>
    <DOC ZN="56203894" FN="0">
      <C N="15" T="0">
        <P C="6" Nm="NESCAFE CLASSIC 10" Sm="6.66" Tx="1" TxPr="20.00" SborPr="0.00" TxOff="0"/>
        <M T="0" Nm="ГОТIВКА" Sm="6.66"/>
      </C>
      <TS>2012-03-29T15:20:56</TS>
    </DOC>
  </EJ>
</FISC>
2 июл 12, 19:15    [12806279]     Ответить | Цитировать Сообщить модератору
 Re: Как запихнуть в базу подобный XML  [new]
RubinDm
Member

Откуда: SPb
Сообщений: 458
Andrew_vb1110, Что на самом деле Вы пытаетесь сделать? В каком виде вы хотите хранить этот xml в базе? В строке в колонке типа blob или xml просто чтоб сохранить и забыть? Или Вам надо распарсить xml и хранить уже результаты парсинга в таблице? Если сам xml Вам не нужен в базе, а нужны только его уже разобранные данные, то расскажите, в таблице какой структуры Вы хотели бы эти данные положить (ну или структуру нескольких таблиц опишите, если в одной таблице Вам все и сразу не надо).
2 июл 12, 20:03    [12806392]     Ответить | Цитировать Сообщить модератору
 Re: Как запихнуть в базу подобный XML  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
RubinDm
Andrew_vb1110, Что на самом деле Вы пытаетесь сделать? В каком виде вы хотите хранить этот xml в базе? В строке в колонке типа blob или xml просто чтоб сохранить и забыть? Или Вам надо распарсить xml и хранить уже результаты парсинга в таблице? Если сам xml Вам не нужен в базе, а нужны только его уже разобранные данные, то расскажите, в таблице какой структуры Вы хотели бы эти данные положить (ну или структуру нескольких таблиц опишите, если в одной таблице Вам все и сразу не надо).

Мне нужно хранить результаты парсинга в одной таблице:
<P C="5" Nm="ШОКОЛАДКА КОРОНА" Sm="5.55" Tx="0" TxPr="0.00" SborPr="0.00" TxOff="0"/>
(это одна строка)
поля в таблице такие же:
C - integer
Nm - varchar(50)
Sm - float
Tx - integer
Надо в цикле записать эти строки в базу.
2 июл 12, 20:29    [12806448]     Ответить | Цитировать Сообщить модератору
 Re: Как запихнуть в базу подобный XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Andrew_vb1110
запихнуть в базу
Запихнуть? .... как я тебя понимаю, друг.

Есть такая вещь как XmlBulkLoad (см. spXmlBulkLoad).
Нужно тупо прописать какой узел в какую таблу впихивается нежно соотносится, хотя вот ещё доступнее 12410359.
2 июл 12, 23:35    [12806886]     Ответить | Цитировать Сообщить модератору
 Re: Как запихнуть в базу подобный XML  [new]
RubinDm
Member

Откуда: SPb
Сообщений: 458
Andrew_vb1110, ну.. про OPENQUERY и разрекламированные выше бульки ничего сказать пока не могу, не использовал, нужды не было. Если задача из разряда разовых, производительность сильно не требуется, то протащите текст xml на сервер, как именно - без разницы, например, как текст через параметр @myXmlText nvarchar(max) хранимой процедуры. В процедуре что-то типа:
-- собственно тут и состоится разбор (без Вашего участия).
declare @myXml xml = @myXmlText; -- неявный кастинг nvarchar(max) в xml

-- далее select, как использовать результаты которого Вы уже решаете сами.
select
  C = [Nodes].[Node].value('@C', 'int'),
  Nm = [Nodes].[Node].value('@Nm', 'varchar(50)'),
  Sm = [Nodes].[Node].value('@Sm', 'float'),
  Tx = [Nodes].[Node].value('@Tx', 'int'),
  -- так можно получить значения родительских тегов (иногда требуется):
  C_N = [Nodes].[Node].value('../@N', 'int'), -- из тега <С> на 1 уровень выше читаем атрибут @N, 
  DOC_ZN = [Nodes].[Node].value('../../@ZN', 'int') -- из тега <DOC> на 2 уровня выше читаем атрибут @ZN, 
-- и т.д.
from @myXml.nodes('/FISC/EJ/DOC/C/P') [Nodes]([Node])


CNmSmTxC_NDOC_ZN
2ЧАЙ NESTEA 0.5Л2.2221156203894
1COCA-COLA 1Л1.1111156203894
3СОК ДОБРЫЙ 1Л3.3331256203894
4БАТОНЧИК SNIKERS4.4441356203894
5ШОКОЛАДКА КОРОНА5.5501456203894
6NESCAFE CLASSIC 106.6611556203894


и да.. когда текст будете запихивать в параметр процедуры - уберите первую строку, которая <?xml version="1.0" encoding="utf-8"?>, иначе не распарсится (почему - не вникал).
3 июл 12, 02:42    [12807308]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить