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

Откуда:
Сообщений: 6
Здравствуйте! Столкнулся с задачей выгрузки данных из XML в SQL.
Есть вайлик C:/1.xml, вот кусок его содержимого:

<?xml version="1.0" encoding="windows-1251" ?>
- <report code="1003" measured="2006/05/16 06:00" comments="Фактические данные">
- <place code="91">
<measurement temperature="7.5" cloud="1" rain="1000" />
</place>
- <place code="151">
<measurement temperature="2.3" cloud="2" rain="1000" />
</place>

- <place code="95">
<measurement temperature="-0.8" cloud="2" rain="21" />
</place>
</report>

Нужно из этого файла вытянуть данные (<place code="151">) measurement temperature, cloud, rain (2.3, 2, 1000) и положить их например в таблицу dbo.pogoda. Этот файлик будет обновлятся каждые пять минут и соответственно данные в нём тоже, и нужно чтобы обновлённые данные также добовлялись в таблицу. Помогите скриптом пожалуйста...
30 дек 09, 05:59    [8135486]     Ответить | Цитировать Сообщить модератору
 Re: Работа с XML в MSSQL 2000  [new]
Virus квартирус
Member

Откуда: Москва
Сообщений: 41
Только средствами SQL Server тут не обойдёшься.
Решение будет состоять из 2-х частей:

1. Хранимая процедура, которая заливает xml-документ в базу.
2. VB скрипт, который читает xml-файл и вызывает эту хранимую процедуру.

В процедуре должен быть параметр типа text, через который будет передаваться текст xml-файла.
Вставка в таблицу реализуется с пом. оператора OPENXML.
30 дек 09, 10:19    [8135939]     Ответить | Цитировать Сообщить модератору
 Re: Работа с XML в MSSQL 2000  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Virus квартирус, как всё сложно, лучше уж SQLXMLBulkLoad, например так заюзать.

Vitaly_A
Этот файлик будет обновлятся каждые пять минут, и нужно обновлённые данные также добовлялись в таблицу.
Маразм.

Может просто тупо перезаливать?:
TRUNCATE TABLE dbo.pogoda
EXEC dbo.spXMLBulkLoad('C:\1.xml','C:\1.xsd')
30 дек 09, 12:23    [8136815]     Ответить | Цитировать Сообщить модератору
 Re: Работа с XML в MSSQL 2000  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Vitaly_A
<report code="1003" measured="2006/05/16 06:00" comments="Фактические данные">
Криворукие заполонили мир. :)
Типы данных стандартизированы! Это не дата с времене, а отсебятина.
comments - это улёт.
30 дек 09, 12:32    [8136889]     Ответить | Цитировать Сообщить модератору
 Re: Работа с XML в MSSQL 2000  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
а SQLXMLBulkLoad в SQL-2000 уже присутствует?
и ещё существует проблема с файлами xsd.
т.к. в основном надо загружать xml с неизвестной (без описания xsd) структурой.
как можно сгенерить xsd автоматически на основе только входного xml?
30 дек 09, 12:40    [8136944]     Ответить | Цитировать Сообщить модератору
 Re: Работа с XML в MSSQL 2000  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
зачем изобретать велосипед:)


DECLARE @hDoc INT

EXEC sp_xml_preparedocument @hDoc OUTPUT, '
<?xml version="1.0" encoding="windows-1251" ?>
<report code="1003" measured="2006/05/16 06:00" comments="Фактические данные">
<place code="91">
<measurement temperature="7.5" cloud="1" rain="1000" />
</place>
<place code="151">
<measurement temperature="2.3" cloud="2" rain="1000" />
</place>
<place code="95">
<measurement temperature="-0.8" cloud="2" rain="21" />
</place>
</report>'

IF @@ERROR != 0 RETURN
SELECT DISTINCT
*

FROM
OPENXML(@hDoc, '//measurement')
WITH
(
code INT '../@code',
temperature float '@temperature',
cloud int '@cloud',
rain int '@rain'
)
WHERE code = 151
EXEC sp_xml_removedocument @hDoc
30 дек 09, 13:25    [8137249]     Ответить | Цитировать Сообщить модератору
 Re: Работа с XML в MSSQL 2000  [new]
Virus квартирус
Member

Откуда: Москва
Сообщений: 41
WarAnt
Ну молодец :)
Читай условие задачи. xml-данные нужно из файла грузить. Каждые 5 минут никто не будет их из файла сидеть и копировать в скрипт.

Mnior
за SQLXMLBulkLoad спасибо, бум знать.
30 дек 09, 13:34    [8137299]     Ответить | Цитировать Сообщить модератору
 Re: Работа с XML в MSSQL 2000  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Вот вам угадывалка схемы.

Предположительный XSD для 2005:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
 <xsd:annotation>
  <xsd:appinfo>
   <sql:relationship name="measurement_place" parent="place" parent-key="code" child="measurement" child-key="place" />
  </xsd:appinfo>
 </xsd:annotation>

 <xsd:element name="report" sql:is-constant="1">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="place">
     <xsd:complexType>
      <xsd:sequence>
       <xsd:element name="measurement" minOccurs="1" maxOccurs="1" sql:relationship="measurement_place">
        <xsd:complexType>
         <xsd:attribute name="temperature" type="xsd:decimal" />
         <xsd:attribute name="cloud" type="xsd:int" />
         <xsd:attribute name="rain" type="xsd:int" />
        </xsd:complexType>
       </xsd:element>
      </xsd:sequence>
      <xsd:attribute name="code" type="xsd:int"/>
     </xsd:complexType>;
    </xsd:element>
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>
Для 2000-го возможно надо докурить.

Юзается так:
USE tempdb
GO
CREATE TABLE dbo.place (code Int PRIMARY KEY)
GO
CREATE TABLE dbo.measurement (place Int REFERENCES dbo.place (code),temperature decimal(2,1),cloud int,rain int)
GO
EXEC dbo.spXMLBulkLoad 'C:\1.xml','C:\1.xsd','tempdb'
SELECT * FROM dbo.place
SELECT * FROM dbo.measurement
GO
code
91
95
151
placetemperaturecloudrain
917.511000
1512.321000
95-0.8221


Но это фигня. Втопку всё! Переделайте свой механизм получения данных с источника, что там? Крадём военные данные? :)

Нормально, без сохранения файла читаем через SAX парсер до /report/place[@code="151"] и тупо делаем из клиента INSERT в вашу dbo.pogoda одну строку данных. А то это изврат и быдлокодерство крайней степени. На чём клиент написан?

SELECT * FROM OPENROWSET(BULK 'C:\1.xml',SINGLE_CLOB)X(X)
30 дек 09, 15:27    [8138054]     Ответить | Цитировать Сообщить модератору
 Re: Работа с XML в MSSQL 2000  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
за угадывалку XSD спасибо!
но хотелось бы в исходнике на нормальном языке VB6, VB.NET, C#
30 дек 09, 15:41    [8138116]     Ответить | Цитировать Сообщить модератору
 Re: Работа с XML в MSSQL 2000  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Konst_One, вы так говорите, словно это стандартный алгоритм.
Угадывалок в инете пруд пруди (это почти первый из гуглового запроса) и каждый выдаёт разный результат. Может быть простой до тупости, продвинутый со статистическим анализом, с описанием элементов по отдельности, с выявлением идентичных конструкций. А для SQLXMLBulkLoad ещё и поиск подходящих таблиц в базе.

XSD лучше получить от поставщика, а sql аннотации писать руками палюбому придётся.
И чё цепляться к XSD, можно прямиком и на XDR писать.
30 дек 09, 19:21    [8139130]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить