Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SqlXmlBulkLoad и снова загрузка дурацких файлов - призываются гуру XML  [new]
aleks2
Guest
О великие гуру! Вот как загрузить такую шнягу через SqlXmlBulkLoad в плоскую таблицу без извращений?

table(NAME, DESC, TV, HK)

  <ROOMS>
   <ROOM NAME="X" DESC="тра-ля-ля">
    <TV VALUE="1"/>
    <HK VALUE="0"/>
   </ROOM>
   <ROOM NAME="Y" DESC="тру-лю-лю">
    <TV VALUE="1"/>
    <HK VALUE="0"/>
   </ROOM>
  </ROOMS>

Был бы element-centric - не было бы проблем
<ROOMS>
   <ROOM NAME="Y" DESC="тру-лю-лю">
    <TV>1</TV>
    <HK>0</HK>
   </ROOM>
</ROOMS>[/


Конечно, можно через жопу. C последующим XQuery к полю Properties.
Но как-то это некошерно...
<xsd:schema 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
>

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

                   <xsd:element name="ROOM" minOccurs="0" maxOccurs="unbounded"
                                sql:relation="xml_rooms" 
                                sql:key-fields="NAME"
                                sql:overflow-field="Properties"
                   >
                     <xsd:complexType>

                       <xsd:attribute name="NAME"    type="xsd:string" use="required"/>
                       <xsd:attribute name="DESC"    type="xsd:string" use="required" sql:field="[DESC]"/>

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

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


Для element-centric
<xsd:schema 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
>

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

                   <xsd:element name="ROOM" minOccurs="0" maxOccurs="unbounded"
                                sql:relation=xml_rooms" 
                                sql:key-fields="NAME"
                   >
                     <xsd:complexType>
                       <xsd:sequence>

                          <xsd:element name="TV" minOccurs="1" maxOccurs="1" type="xsd:string"/>
                          <xsd:element name="HK" minOccurs="1" maxOccurs="1" type="xsd:string"/>

                       </xsd:sequence>

                       <xsd:attribute name="NAME"    type="xsd:string" use="required"/>
                       <xsd:attribute name="DESC"    type="xsd:string" use="required" sql:field="[DESC]"/>

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

                 </xsd:sequence>
               </xsd:complexType>
             </xsd:element>
</xsd:schema>
30 дек 15, 15:36    [18628431]     Ответить | Цитировать Сообщить модератору
 Re: SqlXmlBulkLoad и снова загрузка дурацких файлов - призываются гуру XML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Не гуру-поэтому так
<?xml version="1.0" encoding="utf-8"?>
<schema
  xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:ms="urn:schemas-microsoft-com:mapping-schema">
  <annotation>
    <appinfo>
      <ms:relationship
        name="RoomTv"
        parent="dbo.rooms"
        parent-key="name"
        child="dbo.tv"
        child-key="name" />
      <ms:relationship
        name="RoomHk"
        parent="dbo.rooms"
        parent-key="name"
        child="dbo.hk"
        child-key="name" />
    </appinfo>
  </annotation>
  <element name="rooms" ms:is-constant="1">
    <complexType>
      <sequence>
        <element
          name="room"
          maxOccurs="unbounded"
          ms:relation="dbo.rooms">
          <complexType>
            <sequence>
              <element
                name="tv"
                ms:relation="dbo.tv"
                ms:relationship="RoomTv">
                <complexType>
                  <attribute
                    name="value"
                    type="int"
                    ms:field="tv" />
                </complexType>
              </element>
              <element
                name="hk"
                ms:relation="dbo.hk"
                ms:relationship="RoomHk">
                <complexType>
                  <attribute
                    name="value"
                    type="int"
                    ms:field="hk" />
                </complexType>
              </element>
            </sequence>
            <attribute
              name="name" type="string" ms:field="name"/>
            <attribute
              name="desc" type="string" ms:field="[desc]"/>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>
</schema>
Дальше
select r.name,r.[desc],t.tv,h.hk
from dbo.rooms r
join dbo.tv t on t.name=r.name
join dbo.hk h on h.name=t.name;
4 янв 16, 23:22    [18642766]     Ответить | Цитировать Сообщить модератору
 Re: SqlXmlBulkLoad и снова загрузка дурацких файлов - призываются гуру XML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
все-таки так поближе к требуемому
<?xml version="1.0" encoding="utf-8"?>
<schema
  xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:ms="urn:schemas-microsoft-com:mapping-schema">
  <element name="rooms" ms:is-constant="1">
    <complexType>
      <sequence>
        <element name="room" maxOccurs="unbounded" ms:relation="dbo.rooms">
          <complexType>
            <sequence>
              <element name="tv">
                <complexType>
                  <simpleContent>
                    <extension base="string">
                      <attribute
                        name="value"
                        type="string"
                        ms:field="tv" />
                    </extension>
                  </simpleContent>
                </complexType>
              </element>
              <element name="hk">
                <complexType>
                  <simpleContent>
                    <extension base="string">
                      <attribute
                        name="value"
                        type="string"
                        ms:field="hk" />
                    </extension>
                  </simpleContent>
                </complexType>
              </element>
            </sequence>
            <attribute
              name="name" type="string" ms:field="name"/>
            <attribute
              name="desc" type="string" ms:field="[desc]"/>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>
</schema>
5 янв 16, 01:42    [18643014]     Ответить | Цитировать Сообщить модератору
 Re: SqlXmlBulkLoad и снова загрузка дурацких файлов - призываются гуру XML  [new]
aleks2
Guest
С доп. таблицами - эта технология мне известна. Не канает - таблицы как кролики плодятся.

А вот " <extension base=..." - это прям чудесное заклинание! Спасибо.

Я нигде подобного примера не встречал.
  <ROOMS>
   <ROOM NAME="X" DESC="cccc">
    <TV VALUE="1" XC="2"/>
    <HK VALUE="0"/>
   </ROOM>
   <ROOM NAME="Y" DESC="yyyy">
    <TV VALUE="1" XC="1"/>
    <HK VALUE="0"/>
   </ROOM>
  </ROOMS>

Схема
<xsd:schema 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
>

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

                   <xsd:element name="ROOM" minOccurs="0" maxOccurs="unbounded"
                                sql:relation="xml_rooms" 
                                sql:key-fields="NAME"
                                sql:overflow-field="Properties"
                   >
                     <xsd:complexType>

            <xsd:sequence>

              <xsd:element name="TV" minOccurs="1" maxOccurs="1">
                <xsd:complexType>
                  <xsd:simpleContent>
                    <xsd:extension base="xsd:int">
                      <xsd:attribute name="VALUE" type="xsd:int" sql:field="TV" />
                      <xsd:attribute name="XC" type="xsd:int" sql:field="XC" />
                    </xsd:extension>
                  </xsd:simpleContent>
                </xsd:complexType>
              </xsd:element>

              <xsd:element name="HK" minOccurs="1" maxOccurs="1">
                <xsd:complexType>
                  <xsd:simpleContent>
                    <xsd:extension base="xsd:int">
                      <xsd:attribute name="VALUE" type="xsd:int" sql:field="HK" />
                    </xsd:extension>
                  </xsd:simpleContent>
                </xsd:complexType>
              </xsd:element>

            </xsd:sequence>


                       <xsd:attribute name="NAME"    type="xsd:string" use="required"/>
                       <xsd:attribute name="DESC"    type="xsd:string" use="required" sql:field="[DESC]"/>

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

                 </xsd:sequence>
               </xsd:complexType>
             </xsd:element>
</xsd:schema>
5 янв 16, 16:37    [18644401]     Ответить | Цитировать Сообщить модератору
 Re: SqlXmlBulkLoad и снова загрузка дурацких файлов - призываются гуру XML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
"extension base" взято из этого букваря.
но там же есть более красивый способ, который мне не поддался Empty Content.
5 янв 16, 18:20    [18644785]     Ответить | Цитировать Сообщить модератору
 Re: SqlXmlBulkLoad и снова загрузка дурацких файлов - призываются гуру XML  [new]
aleks2
Guest
andrey odegov
"extension base" взято из этого букваря.
но там же есть более красивый способ, который мне не поддался Empty Content.

Empty Content соответствует случаю 1. Т.е. еще одной таблице.
xmlbulkload.vbs(11, 1) Schema mapping: Schema: relationship expected on 'TV'.

Это следует и из короткой формы записи для Empty Content.

Но суть проблемы не в этом. Примеры с http://www.w3.org/ очень трудно соотнести с SqlXmlBulkLoad.
5 янв 16, 18:46    [18644868]     Ответить | Цитировать Сообщить модератору
 Re: SqlXmlBulkLoad и снова загрузка дурацких файлов - призываются гуру XML  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
это точно. я весь вчерашний день на это потратил, хорошо, что праздники. да и тема эта для меня интересна, а на работе с этим сталкиваться не приходилось.
5 янв 16, 19:00    [18644918]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить