Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQLXmlBulkLoad как грузить дурацкие файлы  [new]
aleks2
Guest
Данные
<?xml version="1.0" encoding="utf-8"?>
<selena>
<apartmentprices>
    <apartment id="26">
        <price id="922" tourid="292"         price_c3="6000.00"         />
    </apartment>
    <apartment id="26">
        <price id="923" tourid="293"         price_c3="11000.00"        />
    </apartment>
    <apartment id="26">
        <price id="924" tourid="295"         price_c3="6000.00"         />
    </apartment>
    </apartment>
</apartmentprices>
</selena>

Схема
<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="ApartmentsPrices"
          parent="xml_apartmentprices"
          parent-key="id"
          child="xml_prices"
          child-key="id" 
      />

    </xsd:appinfo>
  </xsd:annotation>

  <xsd:element name="selena" sql:is-constant="1">
    <xsd:complexType>
      <xsd:sequence>

        <xsd:element name="apartmentprices" sql:is-constant="1" minOccurs="0" maxOccurs="1">
          <xsd:complexType>
           <xsd:sequence>

            <xsd:element name="apartment" minOccurs="0" maxOccurs="unbounded"
                           sql:relation="xml_apartmentprices" 
                           sql:key-fields="id"
            >
             <xsd:complexType>

               <xsd:sequence>
                <xsd:element name="price" minOccurs="0" maxOccurs="unbounded"
                           sql:relation="xml_prices" 
                           sql:relationship="ApartmentsPrices" 
                           sql:key-fields="id priceid"
                >
                 <xsd:complexType>
  <xsd:attribute name="id" type="xsd:int" use="required" sql:field="priceid" /> 
  <xsd:attribute name="tourpackid" type="xsd:int" use="optional" /> 
  <xsd:attribute name="price_c3" type="xsd:float" use="optional" /> 
                 </xsd:complexType>
                </xsd:element>

               </xsd:sequence>
         
               <xsd:attribute name="id" type="xsd:int" use="required"/>

             </xsd:complexType>
            </xsd:element>
      
           </xsd:sequence>
          </xsd:complexType>
        </xsd:element>

     </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

</xsd:schema>


загрузчик
Dim objBL 
Set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")
objBL.ConnectionString = "provider=SQLOLEDB;data source=dc3\WSUS;database=tempdb;integrated security=SSPI"
objBL.ErrorLogFile = "error.log"
objBL.SchemaGen = True
objBL.SGDropTables = True
objBL.IgnoreDuplicateKeys=True
objBL.Execute "apartmentprice_Schema.xsd", "apartmentprice.xml"
Set objBL = Nothing

Но бред же, зачем мне эти повторяющиеся
<apartment id="26">
?
Зачем мне лишняя таблица xml_apartmentprices?

Данные не изменить.
Может у кого есть идея как изменить схему чтобы грузить только xml_prices?
17 ноя 15, 09:34    [18427405]     Ответить | Цитировать Сообщить модератору
 Re: SQLXmlBulkLoad как грузить дурацкие файлы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
aleks2, есть параметр, который позволяет пропускать загрузку элемента или атрибута, но он делает это вместе со всеми дочерними элементами, тут другая ситуация.

Идея, как это поправить - написать XSLT-преобразование, натравить его на XML, и полученный результат уже загружать.
17 ноя 15, 15:52    [18430183]     Ответить | Цитировать Сообщить модератору
 Re: SQLXmlBulkLoad как грузить дурацкие файлы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Вот примерная реализация.

appartmentprice.xslt:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
      <root>
        <xsl:apply-templates/>
      </root>
    </xsl:template>
    <xsl:template match="selena/apartmentprices/apartment">
        <apartmentprice id="{@id}" priceid="{price/@id}" tourid="{price/@tourid}" price_c3="{price/@price_c3}"/>
    </xsl:template>
</xsl:stylesheet>


Загрузчик:
xmlFile = "apartmentprice.xml"
xslFile = "apartmentprice.xslt"
Set xsl = CreateObject("MSXML2.DOMDOCUMENT.6.0")
Set xml = CreateObject("MSXML2.DOMDocument.6.0")
xml.validateOnParse = false
xml.async = false
xml.load(xmlFile)
if (xml.parseError.errorCode <> 0) then WScript.Echo ("XML Parse Error : " + xml.parseError.reason)
xsl.async = false
xsl.load(xslFile)
if xsl.parseError.errorCode <> 0 then WScript.Echo ("XSL Parse Error : " + xsl.parseError.reason)
xmlresult = xml.transformNode(xsl.documentElement)
set fso = CreateObject("Scripting.FileSystemObject")
set ofl = fso.CreateTextFile("apartmentprice_result.xml", true, false)
ofl.Write xmlresult
ofl.Close()
Dim objBL 
Set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")
objBL.ConnectionString = "provider=SQLOLEDB;data source=ddsm-sqldags;database=tempdb;integrated security=SSPI"
objBL.ErrorLogFile = "error.log"
objBL.SchemaGen = True
objBL.SGDropTables = True
objBL.IgnoreDuplicateKeys=True
objBL.Execute "apartmentprice_Schema.xsd", "apartmentprice_result.xml"
Set objBL = Nothing


Схему, понятное дело, тоже придется поменять.
17 ноя 15, 16:33    [18430422]     Ответить | Цитировать Сообщить модератору
 Re: SQLXmlBulkLoad как грузить дурацкие файлы  [new]
aleks2
Guest
Ну чо сказать? Круто.
Может когда и применю, пока же черт с ней, с лишней таблицей.

Видимо
objBL.IgnoreDuplicateKeys=True
аккурат для этого случая придумали.
18 ноя 15, 06:28    [18433074]     Ответить | Цитировать Сообщить модератору
 Re: SQLXmlBulkLoad как грузить дурацкие файлы  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Если уж в ход пошел XSLT (т.е. полный разбор DOM на клиенте), то, может, стоит подумать в сторону XQuery/openxml?
18 ноя 15, 07:45    [18433114]     Ответить | Цитировать Сообщить модератору
 Re: SQLXmlBulkLoad как грузить дурацкие файлы  [new]
aleks2
Guest
Сон Веры Павловны
Если уж в ход пошел XSLT (т.е. полный разбор DOM на клиенте), то, может, стоит подумать в сторону XQuery/openxml?


Чур меня!
Не надо мне XQuery/openxml.
Мне быстро и просто надо.
18 ноя 15, 08:09    [18433145]     Ответить | Цитировать Сообщить модератору
 Re: SQLXmlBulkLoad как грузить дурацкие файлы  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
aleks2
Мне быстро

Поскольку, как я писал выше, XSLT чреват полным разбором DOM на клиенте, то затраты на разбор+трансформацию+заливку уже вполне сравнимы с затратами на разбор через XQuery/openxml. Вполне возможно, что XQuery/openxml будут даже быстрее.
aleks2
и просто надо.

SqlXmlBulkLoad использование схемы в имени таблицы
SQLXmlBulkLoad как грузить дурацкие файлы
SqlXmlBulkLoad с корневым элементом, для которого указано xmlns=
снова по схемам для SQLXMLBulkLoad
XML или красиво жить не запретишь!
что-то клинит меня на простейшем XML
Это просто, да.
18 ноя 15, 11:27    [18434243]     Ответить | Цитировать Сообщить модератору
 Re: SQLXmlBulkLoad как грузить дурацкие файлы  [new]
aleks2
Guest
Сон Веры Павловны
aleks2
Мне быстро

Поскольку, как я писал выше, XSLT чреват полным разбором DOM на клиенте, то затраты на разбор+трансформацию+заливку уже вполне сравнимы с затратами на разбор через XQuery/openxml. Вполне возможно, что XQuery/openxml будут даже быстрее.
aleks2
и просто надо.

SqlXmlBulkLoad использование схемы в имени таблицы
SQLXmlBulkLoad как грузить дурацкие файлы
SqlXmlBulkLoad с корневым элементом, для которого указано xmlns=
снова по схемам для SQLXMLBulkLoad
XML или красиво жить не запретишь!
что-то клинит меня на простейшем XML
Это просто, да.


Ты не процитировал тему, где я аккурат спрашивал про openxml.
загадки OPENXML
Я б ишо поспрошал...

Думаешь я с хорошей жизни метнулся на SqlXmlBulkLoad?
Пока проблемы SqlXmlBulkLoad выглядят менее проблемными. И загрузчик таки я сваял.
19 ноя 15, 08:12    [18438925]     Ответить | Цитировать Сообщить модератору
 Re: SQLXmlBulkLoad как грузить дурацкие файлы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Сон Веры Павловны
Поскольку, как я писал выше, XSLT чреват полным разбором DOM на клиенте, то затраты на разбор+трансформацию+заливку уже вполне сравнимы с затратами на разбор через XQuery/openxml. Вполне возможно, что XQuery/openxml будут даже быстрее.
В принципе есть потоковый XSLT.

То есть идеально, для быстрой загрузки XML любого размера - это потоковый XSLT + SqlXmlBulkLoad
Ну или просто SqlXmlBulkLoad, без XSLT

А то все эти XQuery/openxml затыкаются при детских объёмах - памяти у сервера сотня-две-три гигов, а они не могут загрузить файлик в какой то жалкий десяток гигабайт.
19 ноя 15, 10:48    [18439496]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить