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

Откуда:
Сообщений: 765
Коллеги, помогите!
просто не могу сообразить, как это описать, хотя вроде всё просто.
Вот хмл, который собираюсь грузить:
<?xml version="1.0" encoding="utf-8"?>
<a>
	<b>
	<code>1</code>
	<ds1>1.11</ds1>
	<ds1>1.12</ds1>
	<ds1>1.13</ds1>
	<ds2>2.11</ds2>
	</b>
	
	<b>
	<code>2</code>	
	<ds1>1.21</ds1>
	<ds1>1.22</ds1>
	<ds2>2.21</ds2>
	<ds2>2.22</ds2>
	</b>
	
	<b>
	<code>3</code>		
	<ds1>1.31</ds1>
	<ds2>2.31</ds2>
	<ds2>2.32</ds2>
	</b>

	<b>
	<code>4</code>		
	<ds2>2.41</ds2>
	</b>
	
</a>

А вот структура, в которую хочу грузить:
Create table b
	([_id_b] int identity(1,1) NOT NULL
	,[code] nvarchar(10) NULL
	,Constraint PK_b primary key clustered ([_id_b])
	)
;
Create table ds
	([_id_ds] int identity(1,1) NOT NULL
	,[_id_b] int NOT NULL
	,[ds] nvarchar(10) NULL
	,[type] smallint not null constraint cs_type check ([type] between 1 and 2)
	,Constraint PK_ds primary key clustered ([_id_ds])
	)

Т.е. все множественные теги ds в одну таблицу, с указанием типа.
Как???
15 июн 18, 09:29    [21492771]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить аннотированную схему для sqlxmlbulkload  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 306
uaggster,

Сорри, что не по теме. Но с чего вдруг
[type] between 1 and 2
и smallint ?
15 июн 18, 12:59    [21493524]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить аннотированную схему для sqlxmlbulkload  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Glebanski
uaggster,

Сорри, что не по теме. Но с чего вдруг
[type] between 1 and 2
и smallint ?

вы за tinyint?
15 июн 18, 13:03    [21493538]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить аннотированную схему для sqlxmlbulkload  [new]
uaggster
Member

Откуда:
Сообщений: 765
Glebanski
uaggster,

Сорри, что не по теме. Но с чего вдруг
[type] between 1 and 2
и smallint ?

Это ниоткуда не следует. Это по определению. (С)
15 июн 18, 13:35    [21493665]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить аннотированную схему для sqlxmlbulkload  [new]
aleks222
Member

Откуда:
Сообщений: 850
uaggster
Коллеги, помогите!
просто не могу сообразить, как это описать, хотя вроде всё просто.
Вот хмл, который собираюсь грузить:
<?xml version="1.0" encoding="utf-8"?>
<a>
	<b>
	<code>1</code>
	<ds1>1.11</ds1>
	<ds1>1.12</ds1>
	<ds1>1.13</ds1>
	<ds2>2.11</ds2>
	</b>
	
	<b>
	<code>2</code>	
	<ds1>1.21</ds1>
	<ds1>1.22</ds1>
	<ds2>2.21</ds2>
	<ds2>2.22</ds2>
	</b>
	
	<b>
	<code>3</code>		
	<ds1>1.31</ds1>
	<ds2>2.31</ds2>
	<ds2>2.32</ds2>
	</b>

	<b>
	<code>4</code>		
	<ds2>2.41</ds2>
	</b>
	
</a>

А вот структура, в которую хочу грузить:
Create table b
	([_id_b] int identity(1,1) NOT NULL
	,[code] nvarchar(10) NULL
	,Constraint PK_b primary key clustered ([_id_b])
	)
;
Create table ds
	([_id_ds] int identity(1,1) NOT NULL
	,[_id_b] int NOT NULL
	,[ds] nvarchar(10) NULL
	,[type] smallint not null constraint cs_type check ([type] between 1 and 2)
	,Constraint PK_ds primary key clustered ([_id_ds])
	)

Т.е. все множественные теги ds в одну таблицу, с указанием типа.
Как???


1. Это весьма хреновый вариант XML. Веселый геморрой вам обеспечен.
2. Утилита xsd.exe из комплекта Visual Studio спасет и напишет вам схему. Хотя, буквально вчера, сумрачный гений подкинул мне XML, от которого xsd.exe стошнило.
3. Допилить остальное - попроще будет.
4. Не схему пилят под таблицы, а таблицы под схему.
15 июн 18, 13:38    [21493669]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить аннотированную схему для sqlxmlbulkload  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 306
TaPaK,

Ну вы же не возражаете против nvarchar всего 10.
Значит я за tinyint
15 июн 18, 14:56    [21494018]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить аннотированную схему для sqlxmlbulkload  [new]
uaggster
Member

Откуда:
Сообщений: 765
aleks222
1. Это весьма хреновый вариант XML. Веселый геморрой вам обеспечен.

Да я как бы понимаю.
aleks222
2. Утилита xsd.exe из комплекта Visual Studio спасет и напишет вам схему. Хотя, буквально вчера, сумрачный гений подкинул мне XML, от которого xsd.exe стошнило.

Тут проблема не в создании схемы. Ее то я сделать могу.
И даже не в запихивании двух разных тегов в одну таблицу. Это наверное тоже просто. Я создам два разных комплексных типа, которые будут ссылаться на одну таблицу, и да и фиг с ними. Наверное.
Я не понимаю, как с помощью схемы sqlxmlbulkload записывать в поля таблицы некие предопределенные значения, которых нету в самом xml'е.
Т.е. "тип" ds тега.

<xs:schema xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" 
xmlns:sql="urn:schemas-microsoft-com:mapping-schema" elementFormDefault="qualified">
  <xs:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" 
schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xs:annotation>
    <xs:appinfo>
      <sql:relationship name="FK_ds_b" parent="b" parent-key="_id_b" child="ds" child-key="_id_b" />
    </xs:appinfo>
  </xs:annotation>
  <xs:complexType name="typeb">
    <xs:sequence>
      <xs:element name="code" sql:field="[code]" sql:datatype="nvarchar(10)" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="sqltypes:nvarchar">
            <xs:maxLength value="10" />
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="ds1" type="typeds" sql:relation="ds" sql:relationship="FK_ds_b" sql:key-field="_id_b" minOccurs="0" maxOccurs="unbounded" />
      <xs:element name="ds2" type="typeds" sql:relation="ds" sql:relationship="FK_ds_b" sql:key-field="_id_b" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="typeds">
    <xs:sequence>
      <xs:element name="ds" sql:field="[ds]" sql:datatype="nvarchar(10)" minOccurs="0">
        <!-- Как заставить эту сволочь записать 1 ds1 и 2 для ds2??? -->
        <xs:simpleType>
          <xs:restriction base="sqltypes:nvarchar">
            <xs:maxLength value="10" />
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="type" sql:field="[type]" type="sqltypes:smallint" sql:datatype="smallint" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="typea" sql:is-constant = "1">
    <xs:sequence>
    <xs:element name="b" type="typeb" sql:relation="b" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="a" type="typea" />  
</xs:schema>


aleks222
3. Допилить остальное - попроще будет.
4. Не схему пилят под таблицы, а таблицы под схему.

Да ниоткуда это не следует. Это по определению.
К сожалению.
15 июн 18, 15:12    [21494084]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить аннотированную схему для sqlxmlbulkload  [new]
uaggster
Member

Откуда:
Сообщений: 765
Ок, получается что это невозможно (мучения со схемой - ничего не дали)

Но как то множественные теги ds1 и ds2 в отдельные таблицы ds1 и ds2 - можно грузить???
Как указать то, что они в отдельные таблицы грузятся?
Или может быть их можно все в отдельное xml поле грузить? т.е. все теги ds1 - в отдельное xml поле ds1?

Как то должен этот ужас загружаться?
18 июн 18, 08:39    [21498626]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить аннотированную схему для sqlxmlbulkload  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5625
uaggster
Как то должен этот ужас загружаться?

Не проще будет причесать этот xml с помощью xslt, а потом уже грузить результат преобразования? Как-то так:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />
  <xsl:template match="/">
    <a>
      <xsl:apply-templates />
    </a>
  </xsl:template>
  <xsl:template match="b">
    <b>
      <xsl:attribute name="id">
        <xsl:value-of select="code" />
      </xsl:attribute>
      <xsl:for-each select="*[substring(local-name(), 1, 2)='ds']">
        <ds>
          <xsl:attribute name="type">
            <xsl:value-of select="substring-after(local-name(), substring(local-name(), 1, 2))" />
          </xsl:attribute>
          <xsl:attribute name="value">
            <xsl:value-of select="text()" />
          </xsl:attribute>
        </ds>
      </xsl:for-each>
    </b>
  </xsl:template>
</xsl:stylesheet>

- на выходе получите
<a>
  <b id="1">
    <ds type="1" value="1.11" />
    <ds type="1" value="1.12" />
    <ds type="1" value="1.13" />
    <ds type="2" value="2.11" />
  </b>
  <b id="2">
    <ds type="1" value="1.21" />
    <ds type="1" value="1.22" />
    <ds type="2" value="2.21" />
    <ds type="2" value="2.22" />
  </b>
  <b id="3">
    <ds type="1" value="1.31" />
    <ds type="2" value="2.31" />
    <ds type="2" value="2.32" />
  </b>
  <b id="4">
    <ds type="2" value="2.41" />
  </b>
</a>
18 июн 18, 09:04    [21498668]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить аннотированную схему для sqlxmlbulkload  [new]
uaggster
Member

Откуда:
Сообщений: 765
Сон Веры Павловны, да, идея великолепная, нечто подобное я и хотел, но как вот это
 <ds type="1" value="1.11" />
загрузить в отдельную таблицу?
Я просто не понимаю, как это будет в терминах sqlxmlbulkload, извините.
18 июн 18, 10:49    [21498979]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить