powered by simpleCommunicator - 2.0.27     © 2024 Programmizd 02
Map
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Перенести данные из xml файла в базу данных
2 сообщений из 2, страница 1 из 1
Перенести данные из xml файла в базу данных
    #39894279
Mirapurrr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, мне нужно перенести данные из xml файла в таблицу базы данных. Структура xml файла такая:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
-<licenses_list>
-<licenses>
<name>Имя</name>
<activity_type>Деятельность</activity_type>
<full_name_licensee>Длинное имя</full_name_licensee>
<address>Адрес</address>
 
-<work_address_list>
-<address_place>
<address>Другой адрес</address>
<index>Индекс</index>
<region>Регион</region>
<city>Город</city>
 
-<works>
<work>Услуги 1</work>
<work>Услуги 2</work>
</works>
</address_place>
-<address_place>
<address>Другой адрес</address>
<index>Индекс</index>
<region>Регион</region>
<city>Город</city>
 
-<works>
<work>Услуги 1</work>
<work>Услуги 2</work>
</works>
</address_place>
 
-</licenses_list>
-</licenses>



Я создала таблицу с такими полями. И использовала вот такой скрипт
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
DECLARE @S VARCHAR(MAX);
DECLARE @xml xml;
SELECT @xml = 
CONVERT(xml, BulkColumn, 2) 
FROM OPENROWSET(BULK 'адрес.xml', SINGLE_BLOB) AS x
SET @S = '<?xml version="1.0" encoding="windows-1251"?>' + CONVERT(VARCHAR(MAX),@xml)
 
DECLARE @idoc INT
EXEC sp_xml_preparedocument @idoc OUTPUT, @S
 
TRUNCATE TABLE [dbo].[test1]
INSERT INTO [dbo].[test1]
    ([name]
      ,[activity_type]
      ,[full_name_licensee]
      ,[address]
      ,[INDEX]
      ,[region]
      ,[city]
      ,[WORK]
SELECT
     CASE 
       WHEN name = '' THEN NULL
       ELSE name
     END name
      ,CASE 
       WHEN activity_type = '' THEN NULL
       ELSE activity_type
     END activity_type
      ,CASE 
       WHEN full_name_licensee = '' THEN NULL
       ELSE full_name_licensee
     END full_name_licensee
 ,CASE 
       WHEN address = '' THEN NULL
       ELSE address
     END address
,CASE 
       WHEN [INDEX] = '' THEN NULL
       ELSE [INDEX]
     END [INDEX]
      ,CASE 
       WHEN region = '' THEN NULL
       ELSE region
     END region
     ,CASE 
       WHEN city = '' THEN NULL
       ELSE city
     END city
,CASE 
       WHEN [WORK] = '' THEN NULL
       ELSE [WORK]
     END [WORK]
FROM OPENXML (@idoc,'/licenses_list/licenses')
WITH ([name] [VARCHAR](128) 'name',
    [activity_type] [VARCHAR](128) 'activity_type',
    [full_name_licensee] [VARCHAR](254) 'full_name_licensee',
[address] [VARCHAR](254) 'address',
    [INDEX] [INT] 'index',
    [region] [VARCHAR](128) 'region',
    [city] [VARCHAR](128) 'city',
    [WORK] [VARCHAR](254) 'work'



Таким образом к сожалению в таблицу заполняются только данные до тега <work_address_list>
Мне нужно, чтобы все строки таблицы были заполнены. А так получается, что строки с тегом <work> не заполняются.
Делала разными селектами, но тогда появлялись отдельные записи, где везде пустые значения и только поле work заполнено. А нужно чтобы как то связывались поля. и имя выходило (и остальные данные) для каждого work
Постаралась объяснить понятно, надеюсь вы мне подскажете

Я пробовала в режиме разработчика в excel перевести файл, а потом загружать из excel в бд. Но такой способ подходит только для небольших файлов. Мне же нужно, чтобы работало с большим объемом данных.
...
Рейтинг: 0 / 0
Перенести данные из xml файла в базу данных
    #39894966
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mirapurrr,

1. У вас XML не well-formed.
2. Вы с помощью OPENXML описываете плоский список, а хотите извлечь иерархические данные. Здесь лучше (удобнее) использовать XQuery:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
declare
  @xdata xml=N'
<licenses_list>
  <licenses>
    <name>Имя</name>
    <activity_type>Деятельность</activity_type>
    <full_name_licensee>Длинное имя</full_name_licensee>
    <address>Адрес</address>
    <work_address_list>
      <address_place>
        <address>Другой адрес</address>
        <index>Индекс</index>
        <region>Регион</region>
        <city>Город</city>
        <works>
          <work>Услуги 1</work>
          <work>Услуги 2</work>
        </works>
      </address_place>
      <address_place>
        <address>Другой адрес1</address>
        <index>Индекс1</index>
        <region>Регион1</region>
        <city>Город1</city>
        <works>
          <work>Услуги 11</work>
          <work>Услуги 22</work>
        </works>
      </address_place>
    </work_address_list>
  </licenses>
</licenses_list>';
select
  t1.licenses.value('name[1]', 'varchar(3)') name,
  t1.licenses.value('activity_type[1]', 'varchar(12)') activity_type,
  t1.licenses.value('full_name_licensee[1]', 'varchar(11)') full_name_licensee,
  t1.licenses.value('address[1]', 'varchar(5)') address,
  t2.address_place.value('address[1]', 'varchar(50)') address,
  t2.address_place.value('index[1]', 'varchar(10)') [index],
  t2.address_place.value('region[1]', 'varchar(10)') region,
  t2.address_place.value('city[1]', 'varchar(10)') city,
  t3.work.value('.', 'varchar(10)') work
from @xdata.nodes('/licenses_list/licenses') t1(licenses)
cross apply t1.licenses.nodes('work_address_list/address_place') t2(address_place)
cross apply t2.address_place.nodes('works/work') t3(work)


Ну, и такие вопросы лучше задавать в разделе про MS SQL Server, т.к. в них специфика не столько от xml/xslt/xpath, сколько от SQL Server.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Перенести данные из xml файла в базу данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]