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

Откуда:
Сообщений: 36439
Снова я о наболевшем.
Посредством SSIS экспортирую результат запрос, получаю проский набор данных и выплевываю его в xml-файл.
Вот запрос.
select * from TN for xml auto

Потом пытаюсь его засосать примерно так:
DECLARE @XMLTable TABLE  (xmlTN XML)
       
INSERT INTO @XMLTable(xmlTN)

SELECT TNXML FROM
   (
       SELECT * 
       FROM OPENROWSET(BULK 'D:\Test\TN_AB_AS_2015-09-24_184947.xml', SINGLE_BLOB) AS Invoices
   ) AS TN(TNXML)

   SELECT *
   FROM @XMLTable

пишет: "XML parsing: line 2, character 1, equal expected"

Файл имеет вид:
<TN_export tn_ab_id="1" tn_fasovsize="5.000000000000000e+000" tov_ab_id="-7056926" tov_name="Товар 1" tov_proizv="&quot;Производитель&quot;" tov_categor="ХСЗР" tov_group="Гербицид" tar_ab_id="3" tar_name="канистра" tar_namecode="кан." edi_ab_id="2" edi_name="литр" edi_namecode="л" edi_ab_id_fasedizm="2" edi_name_fasedizm="литр" edi_namecode_fasedizm="л"/>


Толи я его выгружаю нетак, толи загружаю.
XML Source в SSIS тоже данные не хочет в нем видеть.
24 сен 15, 19:00    [18191799]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
жЫвоглот,

потому как xml получился в кодировке 1251, а при загрузке по умолчанию ждется (если нет соответствующей шапки) кодировка utf-8
24 сен 15, 19:11    [18191846]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
жЫвоглот
Member

Откуда:
Сообщений: 36439
Файл юникодовский. А что написать, чтгбы понял?
24 сен 15, 19:23    [18191897]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
жЫвоглот
Member

Откуда:
Сообщений: 36439
Переконвертил файл в utf-8, результат не изменился
Что характерно, XML Source структуру файла понял и сгенерировал xsd-файл, где поля описаны правильно.
Ничего не понимаю!
25 сен 15, 10:16    [18193393]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
жЫвоглот
Member

Откуда:
Сообщений: 36439
Опа, а если файл открыть браузером, то пишет "В документах XML допускается только один элемент верхнего уровня".
Сердцем чую, дело в структуре.
25 сен 15, 10:19    [18193413]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
жЫвоглот
Member

Откуда:
Сообщений: 36439
так и есть, образцовая структура вот такого вида засасывается на ура, а моя ошибочна
<?xml version='1.0'?>
<data xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<xsd:schema>
 <xsd:simpleType name='NameType'>
  <xsd:restriction base='xsd:string'>
   <xsd:minLength value='0'/>
   <xsd:maxLength value='50'/>
  </xsd:restriction>
 </xsd:simpleType>
 <xsd:element name='Name' type='NameType' nillable='true'/>
 <xsd:simpleType name='FamilyType'>
  <xsd:restriction base='xsd:string'>
   <xsd:minLength value='0'/>
   <xsd:maxLength value='50'/>
  </xsd:restriction>
 </xsd:simpleType>
 <xsd:element name='Family' type='FamilyType' nillable='true'/>
<xsd:element name='row'>
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element ref='Name'/>
    <xsd:element ref='Family'/>
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
 <xsd:element name='data'>
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element ref='row' maxOccurs='unbounded'/>
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>
 <!-- data follows -->
 <row><Name>Fred</Name><Family>Jones</Family></row>
 <row><Name>WWW</Name><Family>CCCCD</Family></row> 
</data>
25 сен 15, 11:26    [18193868]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
жЫвоглот
Опа, а если файл открыть браузером, то пишет "В документах XML допускается только один элемент верхнего уровня".
Сердцем чую, дело в структуре.


для типа xml в ms sql элемент верхнего уровня не обязателен. потому как, этот тип, строго говоря, xml-фрагменты хранит.
вы приложили бы пример файла, который не грузится.
25 сен 15, 11:49    [18194068]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
жЫвоглот
Member

Откуда:
Сообщений: 36439
Результат запроса
select * from TN  for xml raw, elements, root, XMLSCHEMA

записал в файл, он получился вот такой
<root>
  <xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
    <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
    <xsd:element name="row">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="tn_ab_id" type="sqltypes:int" minOccurs="0" />
          <xsd:element name="tov_ab_id" type="sqltypes:int" minOccurs="0" />
          <xsd:element name="tov_name" minOccurs="0">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1049" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="255" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:element>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2">
    <tn_ab_id>1</tn_ab_id>
    <tov_ab_id>-7056926</tov_ab_id>
    <tov_name>Лонтрел-300, ВР (300 г/л)</tov_name>
  </row>
  <row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2">
    <tn_ab_id>2</tn_ab_id>
    <tov_ab_id>-7056893</tov_ab_id>
    <tov_name>Фуфанон, КЭ (570 г/л)</tov_name>
  </row>
</root>

Скрипт из моего первого поста этот файл начал понимать, но XML Source в SSIS так и ругается, пишет "http://schemas.microsoft.com/sqlserver/2004/sqltypes:int is not deсlared"
25 сен 15, 12:00    [18194131]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
жЫвоглот
Member

Откуда:
Сообщений: 36439
Уточню задачу.
Данные вот из этого последнего файла надо затянуть посредством SSIS.
25 сен 15, 12:01    [18194136]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
жЫвоглот,

Незнаю че у вас там не получается, я же написал файл должен быть utf-8 тогда не нужна шапка.

К сообщению приложен файл. Размер - 42Kb
25 сен 15, 12:05    [18194165]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
жЫвоглот
Member

Откуда:
Сообщений: 36439
Ага, спасибо, с этим я разобрался. Получил такое же.
Но, XML Source все равно не хочет затягивать данные.
Вот я и терзаюсь, нельзя ли без него данные в таблицу запихать?
25 сен 15, 12:11    [18194206]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
жЫвоглот
Ага, спасибо, с этим я разобрался. Получил такое же.
Но, XML Source все равно не хочет затягивать данные.
Вот я и терзаюсь, нельзя ли без него данные в таблицу запихать?


Source не юзал но подозреваю, что ему придется подсовывать полноценный xml, то есть с <?xml version='1.0'?> в начале.
25 сен 15, 12:15    [18194239]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
WarAnt,

Ну и конечно же с одним корневым элементом аля <ROOT>
25 сен 15, 12:16    [18194255]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
жЫвоглот
Member

Откуда:
Сообщений: 36439
Это прискорбно.
А нельзя ли запросом запихать данные из файла в таблицу?
25 сен 15, 12:26    [18194315]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
жЫвоглот
Это прискорбно.
А нельзя ли запросом запихать данные из файла в таблицу?


SELECT '<?xml version=''1.0''?><ROOT>'+convert(nvarchar(max), convert(xml,TNXML))+'</ROOT>' FROM
   (
       SELECT * 
       FROM OPENROWSET(BULK 'D:\Test.xml', SINGLE_BLOB) AS Invoices
   ) AS TN(TNXML)


НО ИМХО правильнее было бы выгружать в xml файл в "нужном" формате
25 сен 15, 12:44    [18194406]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
жЫвоглот
А нельзя ли запросом запихать данные из файла в таблицу?
+
use tempdb;
go

/*Формируем файл*/
declare @s varchar(max) = '<root>
  <xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
    <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
    <xsd:element name="row">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="tn_ab_id" type="sqltypes:int" minOccurs="0" />
          <xsd:element name="tov_ab_id" type="sqltypes:int" minOccurs="0" />
          <xsd:element name="tov_name" minOccurs="0">
            <xsd:simpleType>
              <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1049" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth">
                <xsd:maxLength value="255" />
              </xsd:restriction>
            </xsd:simpleType>
          </xsd:element>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2">
    <tn_ab_id>1</tn_ab_id>
    <tov_ab_id>-7056926</tov_ab_id>
    <tov_name>Лонтрел-300, ВР (300 г/л)</tov_name>
  </row>
  <row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2">
    <tn_ab_id>2</tn_ab_id>
    <tov_ab_id>-7056893</tov_ab_id>
    <tov_name>Фуфанон, КЭ (570 г/л)</tov_name>
  </row>
</root>';

create table dbo.t (s varchar(max));
insert into dbo.t values (@s);
exec xp_cmdshell 'bcp "tempdb.dbo.t" out C:\Temp\Test.xml -c -T -C RAW', no_output;
drop table dbo.t;
go

/*Из файла в набор данных*/
declare @t table (x xml);

insert into @t
select
 a.x
from
 openrowset(bulk 'C:\Temp\Test.xml', single_clob) a(x);

with xmlnamespaces('urn:schemas-microsoft-com:sql:SqlRowSet2' as ns1)
select
 a.n.value('ns1:tn_ab_id[1]', 'int'),
 a.n.value('ns1:tov_ab_id[1]', 'varchar(100)'),
 a.n.value('ns1:tov_name[1]', 'varchar(100)')
from
 @t t cross apply
 t.x.nodes('/root/ns1:row') a(n);
go

exec xp_cmdshell 'del C:\Temp\Test.xml', no_output;
go
25 сен 15, 13:07    [18194536]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
жЫвоглот
Member

Откуда:
Сообщений: 36439
WarAnt
жЫвоглот
Это прискорбно.
А нельзя ли запросом запихать данные из файла в таблицу?


SELECT '<?xml version=''1.0''?><ROOT>'+convert(nvarchar(max), convert(xml,TNXML))+'</ROOT>' FROM
   (
       SELECT * 
       FROM OPENROWSET(BULK 'D:\Test.xml', SINGLE_BLOB) AS Invoices
   ) AS TN(TNXML)


НО ИМХО правильнее было бы выгружать в xml файл в "нужном" формате

Я тут экспериментирую с WriteXml, если получится - сообщу
25 сен 15, 13:24    [18194658]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт-импор в xml  [new]
жЫвоглот
Member

Откуда:
Сообщений: 36439
Мда. Толи лыжи не едут, толи я...
Решил проблему радикально.
Ни одно из предложенных решений толком и не заработало, на что-то да ругается, экспериментировал с разными параметрами for xml. По итогам правильно был понят только файл, сформированный через WriteXml. Вот пример, я из него вдохновлялся: https://support.microsoft.com/ru-ru/kb/308064.
На выходе получился отличный файл, который понимают и браузеры, и SSIS.
В общем и целом, я негодую, зачем нагородили весь этот огород, который друг с другом не дружит?
25 сен 15, 14:41    [18195152]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить