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

Откуда:
Сообщений: 108
Добрый день.

Есть XML файл. Его нужно залить в БД. Для закачки используется XML Bulk Load.
Возникла проблема при написании аннотированной схемы.
Имеется элемент, назовем его "repeat_recurring_Element", который является рекурсивным и в тоже время может иметь разных предков.

Пример XML файла:

<?xml version="1.0" encoding="UTF-8"?>
<root xsi:noNamespaceSchemaLocation="examp.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Start dnPrefix="Undefined">
		<Element_1 id="text">
			<Element_2 id="text">
				<repeat_recurring_Element id="text">
					<attributes_1>text</attributes_1>
					<attributes_2>text</attributes_2>
				</repeat_recurring_Element>
				<Element_3 id="text">
					<attributes_1>text</attributes_1>
					<attributes_2>text</attributes_2>
					<repeat_recurring_Element id="text">
						<attributes_1>text</attributes_1>
						<attributes_2>text</attributes_2>
						<repeat_recurring_Element id="text">
								<attributes_1>text</attributes_1>
								<attributes_2>text</attributes_2>
								<repeat_recurring_Element id="text">
									<attributes_1>text</attributes_1>
									<attributes_2>text</attributes_2>
									<repeat_recurring_Element id="text">
										<attributes_1>text</attributes_1>
										<attributes_2>text</attributes_2>
									</repeat_recurring_Element>
								</repeat_recurring_Element>
							</repeat_recurring_Element>
					</repeat_recurring_Element>
					<Element_4 id="text">
						<attributes_1>text</attributes_1>
						<attributes_2>text</attributes_2>
						<repeat_recurring_Element id="text">
							<attributes_1>text</attributes_1>
							<attributes_2>text</attributes_2>
						</repeat_recurring_Element>
						<Element_5 id="text">
							<attributes_1>text</attributes_1>
							<attributes_2>text</attributes_2>
							<repeat_recurring_Element id="text">
								<attributes_1>text</attributes_1>
								<attributes_2>text</attributes_2>
							</repeat_recurring_Element>
						</Element_5>
						<Element_6 id="text">
							<attributes_1>text</attributes_1>
							<attributes_2>text</attributes_2>
							<repeat_recurring_Element id="text">
								<attributes_1>text</attributes_1>
								<attributes_2>text</attributes_2>
							</repeat_recurring_Element>
							<Element_7 id="text">
								<attributes_1>text</attributes_1>
								<repeat_recurring_Element id="text">
									<attributes_1>text</attributes_1>
									<attributes_2>text</attributes_2>
								</repeat_recurring_Element>
							</Element_7>
							<Element_8 id="text">
								<attributes_1>text</attributes_1>
								<repeat_recurring_Element id="text">
									<attributes_1>text</attributes_1>
									<attributes_2>text</attributes_2>
								</repeat_recurring_Element>
							</Element_8>
						</Element_6>
					</Element_4>
				</Element_3>
			</Element_2>
		</Element_1>
	</Start>
</root>

его xsd-схема:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">	
	<xs:element name="root">
		<xs:complexType>
			<xs:sequence>				
				<xs:element name="Start" maxOccurs="unbounded">
					<xs:complexType>
						<xs:choice>
							<xs:element ref="Element_1"/>
							<xs:element ref="Element_2"/>							
						</xs:choice>
						<xs:attribute name="dnPrefix" type="xs:string" use="optional"/>
					</xs:complexType>
				</xs:element>				
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	
	<xs:element name="repeat_recurring_Element">
		<xs:complexType>
			<xs:sequence>
				<xs:element name ="attributes_1"/>
				<xs:element name ="attributes_2"/>
				<xs:element ref="repeat_recurring_Element" minOccurs="0"/>
			</xs:sequence>
			<xs:attribute name="id" use="required"/>							
		</xs:complexType>
	</xs:element>	
	
	<xs:element name="Element_8">
		<xs:complexType>
			<xs:sequence>
				<xs:element name ="attributes_1"/>
				<xs:element ref="repeat_recurring_Element"/> 
			</xs:sequence>
			<xs:attribute name="id" use="required"/>
		</xs:complexType>
	</xs:element>
	
	<xs:element name="Element_7">
		<xs:complexType>
			<xs:sequence>
				<xs:element name ="attributes_1"/>
				<xs:element ref="repeat_recurring_Element"/>
			</xs:sequence>
			<xs:attribute name="id" use="required"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="Element_6">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="attributes_1"/>
				<xs:element name="attributes_2"/>
				<xs:element ref="repeat_recurring_Element"/>
				<xs:element ref="Element_7"/>
				<xs:element ref="Element_8"/>
			</xs:sequence>
			<xs:attribute name="id" use="required"/>				
		</xs:complexType>
	</xs:element>
	
	<xs:element name="Element_5">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="attributes_1"/>
				<xs:element name="attributes_2"/>
				<xs:element ref="repeat_recurring_Element"/>
			</xs:sequence>
			<xs:attribute name="id" use="required"/>
		</xs:complexType>
	</xs:element>
	
	<xs:element name="Element_4">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="attributes_1"/>
				<xs:element name="attributes_2"/>
				<xs:element ref="repeat_recurring_Element"/>
				<xs:element ref="Element_5"/>
				<xs:element ref="Element_6"/>
			</xs:sequence>
			<xs:attribute name="id" use="required"/>
		</xs:complexType>
	</xs:element>
	
	<xs:element name="Element_3">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="attributes_1"/>
				<xs:element name="attributes_2"/>
				<xs:element ref="repeat_recurring_Element"/>
				<xs:element ref="Element_4"/>
			</xs:sequence>
			<xs:attribute name="id" use="required"/>
		</xs:complexType>
	</xs:element>
	
	<xs:element name="Element_2">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="repeat_recurring_Element"/>
				<xs:element ref="Element_3"/>
			</xs:sequence>
			<xs:attribute name="id" use="required"/>
		</xs:complexType>
	</xs:element>
	
	<xs:element name="Element_1">
		<xs:complexType>
			<xs:choice>
				<xs:element ref="Element_1"/>
				<xs:element ref="Element_2"/>
			</xs:choice>
			<xs:attribute name="id" use="required"/>
		</xs:complexType>
	</xs:element>
</xs:schema>

Подскажите как для элемента
repeat_recurring_Element 
прописать правильно все relationship.
Заранее спасибо.
18 окт 09, 12:46    [7801532]     Ответить | Цитировать Сообщить модератору
 Re: Xml bulk load  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Попытаемся сдвинуть с мёртвой точки.
19 окт 09, 22:14    [7808523]     Ответить | Цитировать Сообщить модератору
 Re: Xml bulk load  [new]
Sharik_
Member

Откуда:
Сообщений: 108
Mnior
Попытаемся сдвинуть с мёртвой точки.

Пытаюсь сдвинуться с мертвой точки...
Создаю таблицы:

CREATE TABLE [dbo].[Element_1](
	[id] [char](255)
) ON [PRIMARY]

CREATE TABLE [dbo].[Element_2](
	[id] [char](255)
) ON [PRIMARY]

CREATE TABLE [dbo].[Element_3](
	[attributes_1] [char](255),
	[attributes_2] [char](255),
	[id] [char](255),
	[ParentId] [varchar](250) 
) ON [PRIMARY]

CREATE TABLE [dbo].[Element_4](
	[attributes_1] [char](255),
	[attributes_2] [char](255),
	[id] [char](255),
	[ParentId] [varchar](250) 
) ON [PRIMARY]

CREATE TABLE [dbo].[Element_5](
	[attributes_1] [char](255),
	[attributes_2] [char](255),
	[id] [char](255),
	[ParentId] [varchar](250) 
) ON [PRIMARY]

CREATE TABLE [dbo].[Element_6](
	[attributes_1] [char](255),
	[attributes_2] [char](255),
	[id] [char](255),
	[ParentId] [varchar](250) 
) ON [PRIMARY]

CREATE TABLE [dbo].[Element_7](
	[attributes_1] [char](255),
	[id] [char](255),
	[ParentId] [varchar](250) 
) ON [PRIMARY]

CREATE TABLE [dbo].[Element_8](
	[attributes_1] [char](255),
	[id] [char](255),
	[ParentId] [varchar](250) 
) ON [PRIMARY]

CREATE TABLE [dbo].[repeat_recurring_Element](
	[attributes_1] [char](255) ,
	[attributes_2] [char](255) ,
	[id] [char](255) ,
	[ParentId] [varchar](255) 
) ON [PRIMARY]

XML-файл немного модифицированный в плане данных:
<?xml version="1.0" encoding="UTF-8"?>
<root xsi:noNamespaceSchemaLocation="examp.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Start dnPrefix="Undefined">
		<Element_1 id="el1">
			<Element_2 id="el2">
				<repeat_recurring_Element id="text">
					<attributes_1>text</attributes_1>
					<attributes_2>text</attributes_2>
				</repeat_recurring_Element>
				<Element_3 id="el3">
					<attributes_1>text</attributes_1>
					<attributes_2>text</attributes_2>
					<repeat_recurring_Element id="text1">
						<attributes_1>text</attributes_1>
						<attributes_2>text</attributes_2>
						<repeat_recurring_Element id="text2">
								<attributes_1>text</attributes_1>
								<attributes_2>text</attributes_2>
								<repeat_recurring_Element id="text3">
									<attributes_1>text</attributes_1>
									<attributes_2>text</attributes_2>
									<repeat_recurring_Element id="text4">
										<attributes_1>text</attributes_1>
										<attributes_2>text</attributes_2>
									</repeat_recurring_Element>
								</repeat_recurring_Element>
							</repeat_recurring_Element>
					</repeat_recurring_Element>
					<Element_4 id="el4">
						<attributes_1>text</attributes_1>
						<attributes_2>text</attributes_2>
						<repeat_recurring_Element id="text5">
							<attributes_1>text</attributes_1>
							<attributes_2>text</attributes_2>
						</repeat_recurring_Element>
						<Element_5 id="el5">
							<attributes_1>text</attributes_1>
							<attributes_2>text</attributes_2>
							<repeat_recurring_Element id="text6">
								<attributes_1>text</attributes_1>
								<attributes_2>text</attributes_2>
							</repeat_recurring_Element>
						</Element_5>
						<Element_6 id="el6">
							<attributes_1>text</attributes_1>
							<attributes_2>text</attributes_2>
							<repeat_recurring_Element id="text7">
								<attributes_1>text</attributes_1>
								<attributes_2>text</attributes_2>
							</repeat_recurring_Element>
							<Element_7 id="el7">
								<attributes_1>text</attributes_1>
								<repeat_recurring_Element id="text8">
									<attributes_1>text</attributes_1>
									<attributes_2>text</attributes_2>
								</repeat_recurring_Element>
							</Element_7>
							<Element_8 id="el8">
								<attributes_1>text</attributes_1>
								<repeat_recurring_Element id="text9">
									<attributes_1>text</attributes_1>
									<attributes_2>text</attributes_2>
								</repeat_recurring_Element>
							</Element_8>
						</Element_6>
					</Element_4>
				</Element_3>
			</Element_2>
		</Element_1>
	</Start>
</root>

Аннотированная схема:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:annotation>
		<xs:appinfo>
			<sql:relationship name="rel_repeat_recurring_Element" parent="repeat_recurring_Element" parent-key="id" child="repeat_recurring_Element" child-key="ParentId"/>
			<sql:relationship name="Element_3_Element_4" parent="Element_3" parent-key="id" child="Element_4" child-key="ParentId"/>
			<sql:relationship name="Element_2_Element_3" parent="Element_2" parent-key="id" child="Element_3" child-key="ParentId"/>						
			<sql:relationship name="Element_6_Element_7" parent="Element_6" parent-key="id" child="Element_7" child-key="ParentId"/>									
			<sql:relationship name="Element_6_Element_8" parent="Element_6" parent-key="id" child="Element_8" child-key="ParentId"/>									
			<sql:relationship name="Element_4_Element_5" parent="Element_4" parent-key="id" child="Element_5" child-key="ParentId"/>									
			<sql:relationship name="Element_4_Element_6" parent="Element_4" parent-key="id" child="Element_6" child-key="ParentId"/>															
		</xs:appinfo>
	</xs:annotation>
	
	<xs:element name="root">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Start" maxOccurs="unbounded" sql:is-constant="1">
					<xs:complexType>
						<xs:choice>
							<xs:element ref="Element_1"/>
							<xs:element ref="Element_2"/>
						</xs:choice>
						<!--xs:attribute name="dnPrefix" type="xs:string" use="optional"/-->
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>


	<xs:element name="repeat_recurring_Element" type="type_repeat_recurring_Element" sql:relationship="rel_repeat_recurring_Element" sql:key-fields="id" sql:limit-field="ParentId"/>
	<xs:complexType name="type_repeat_recurring_Element" >
		<xs:sequence>
			<xs:element name="repeat_recurring_Element" type="type_repeat_recurring_Element" sql:relation="repeat_recurring_Element" sql:relationship="rel_repeat_recurring_Element" sql:key-fields="id"/>
			<xs:element name="attributes_1" sql:field="attributes_1"/>
			<xs:element name="attributes_2" sql:field="attributes_2"/>
		</xs:sequence>
		<xs:attribute name="id" use="required" sql:field="id"/>
	</xs:complexType>
	
	<xs:element name="Element_8" sql:relation="Element_8" sql:relationship ="Element_6_Element_8">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="attributes_1" sql:field="attributes_1"/>
				<xs:element name="repeat_recurring_Element" sql:is-constant="1"/>
			</xs:sequence>
			<xs:attribute name="id" use="required" sql:field="id"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="Element_7" sql:relation="Element_7" sql:relationship ="Element_6_Element_7">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="attributes_1" sql:field="attributes_1"/>
				<xs:element name="repeat_recurring_Element" sql:is-constant="1"/>
			</xs:sequence>
			<xs:attribute name="id" use="required" sql:field="id"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="Element_6" sql:relation="Element_6" sql:relationship ="Element_4_Element_6">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="attributes_1" sql:field="attributes_1"/>
				<xs:element name="attributes_2" sql:field="attributes_2"/>
				<xs:element name="repeat_recurring_Element" sql:is-constant="1"/>
				<xs:element ref="Element_7"/>
				<xs:element ref="Element_8"/>
			</xs:sequence>
			<xs:attribute name="id" use="required" sql:field="id"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="Element_5" sql:relation="Element_5" sql:relationship ="Element_4_Element_5">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="attributes_1" sql:field="attributes_1"/>
				<xs:element name="attributes_2" sql:field="attributes_2"/>
				<xs:element name="repeat_recurring_Element" sql:is-constant="1"/>
			</xs:sequence>
			<xs:attribute name="id" use="required" sql:field="id"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="Element_4" sql:relation="Element_4" sql:relationship ="Element_3_Element_4">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="attributes_1" sql:field="attributes_1"/>
				<xs:element name="attributes_2" sql:field="attributes_2"/>
				<xs:element name="repeat_recurring_Element" sql:is-constant="1"/>
				<xs:element ref="Element_5"/>
				<xs:element ref="Element_6"/>
			</xs:sequence>
			<xs:attribute name="id" use="required"  sql:field="id"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="Element_3" sql:relation="Element_3" sql:relationship ="Element_2_Element_3" >
		<xs:complexType>
			<xs:sequence>
				<xs:element name="attributes_1" sql:field="attributes_1"/>
				<xs:element name="attributes_2" sql:field="attributes_2"/>
				<xs:element name="repeat_recurring_Element" sql:is-constant="1"/>
				<xs:element ref="Element_4" />
			</xs:sequence>
			<xs:attribute name="id" use="required" sql:field="id"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="Element_2" sql:relation="Element_2">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="repeat_recurring_Element" sql:is-constant="1"/>
				<xs:element ref="Element_3"/>
			</xs:sequence>
			<xs:attribute name="id" use="required" sql:field="id"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="Element_1" sql:relation="Element_1">
		<xs:complexType>
			<xs:choice>
				<xs:element ref="Element_1"/>
				<xs:element ref="Element_2"/>
			</xs:choice>
			<xs:attribute name="id" use="required" sql:field="id"/>
		</xs:complexType>
	</xs:element>
</xs:schema>

Результат bulk load:
на запрос:
select * from Element_2
select * from Element_3
select * from Element_4
select * from Element_5
select * from Element_6
select * from Element_7
select * from Element_8
select * from repeat_recurring_Element

id	 	 	 
el2	 	 	 
 	 	 	 
attributes_1	attributes_2	id	ParentId
text           	text           	el3	el2
 	 	 	 
attributes_1	attributes_2	id	ParentId
text           	text           	el4	el3
 	 	 	 
attributes_1	attributes_2	id	ParentId
text           	text           	el5	el4
 	 	 	 
attributes_1	attributes_2	id	ParentId
text           	text           	el6	el4
 	 	 	 
attributes_1	id	ParentId	 
text           	el7	el6	 
 	 	 	 
attributes_1	id	ParentId	 
text           	el8	el6	 
 	 	 	 
attributes_1	attributes_2	id	ParentId
text           	text           	text4          	text3
text           	text           	text3          	NULL

и как видно из результата теряю данные.

Как все-таки правильно написать схему в части элемента repeat_recurring_Element, чтобы не потерять связь с его многочисленными родителями?
23 окт 09, 15:22    [7830494]     Ответить | Цитировать Сообщить модератору
 Re: Xml bulk load  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Надо оберегать глаза собеседников:
+
SELECT	X.value('@id','char(255)')				AS id
FROM	@XML.nodes('/root/Start/Element_1')T(X)

SELECT	X.value('@id','char(255)')				AS id
FROM	@XML.nodes('/root/Start/Element_1/Element_2')T(X)

SELECT	 X.value('(attributes_1/text())[1]','char(255)')	AS attributes_1
	,X.value('(attributes_2/text())[1]','char(255)')	AS attributes_2
	,X.value('@id','char(255)')				AS id
	,X.value('../@id','char(255)')				AS ParentId
FROM	@XML.nodes('/root/Start/Element_1/Element_2/Element_3')T(X)

SELECT	 X.value('(attributes_1/text())[1]','char(255)')	AS attributes_1
	,X.value('(attributes_2/text())[1]','char(255)')	AS attributes_2
	,X.value('@id','char(255)')				AS id
	,X.value('../@id','char(255)')				AS ParentId
FROM	@XML.nodes('/root/Start/Element_1/Element_2/Element_3/Element_4')T(X)

SELECT	 X.value('(attributes_1/text())[1]','char(255)')	AS attributes_1
	,X.value('(attributes_2/text())[1]','char(255)')	AS attributes_2
	,X.value('@id','char(255)')				AS id
	,X.value('../@id','char(255)')				AS ParentId
FROM	@XML.nodes('/root/Start/Element_1/Element_2/Element_3/Element_4/Element_5')T(X)

SELECT	 X.value('(attributes_1/text())[1]','char(255)')	AS attributes_1
	,X.value('(attributes_2/text())[1]','char(255)')	AS attributes_2
	,X.value('@id','char(255)')				AS id
	,X.value('../@id','char(255)')				AS ParentId
FROM	@XML.nodes('/root/Start/Element_1/Element_2/Element_3/Element_4/Element_6')T(X)

SELECT	 X.value('(attributes_1/text())[1]','char(255)')	AS attributes_1
	,X.value('@id','char(255)')				AS id
	,X.value('../@id','char(255)')				AS ParentId
FROM	@XML.nodes('/root/Start/Element_1/Element_2/Element_3/Element_4/Element_6/Element_7')T(X)

SELECT	 X.value('(attributes_1/text())[1]','char(255)')	AS attributes_1
	,X.value('@id','char(255)')				AS id
	,X.value('../@id','char(255)')				AS ParentId
FROM	@XML.nodes('/root/Start/Element_1/Element_2/Element_3/Element_4/Element_6/Element_8')T(X)

SELECT	 X.value('(attributes_1/text())[1]','char(255)')	AS attributes_1
	,X.value('(attributes_2/text())[1]','char(255)')	AS attributes_2
	,X.value('@id','char(255)')				AS id
	,X.value('../@id','char(255)')				AS ParentId
FROM	@XML.nodes('/root/Start/Element_1//repeat_recurring_Element')T(X)
Т.е. должно быть так:
+

id
el1

id
el2

attributes_1attributes_2idParentId
texttextel3el2

attributes_1attributes_2idParentId
texttextel4el3

attributes_1attributes_2idParentId
texttextel5el4

attributes_1attributes_2idParentId
texttextel6el4

attributes_1idParentId
textel7el6

attributes_1idParentId
textel8el6

attributes_1attributes_2idParentId
texttexttextel2
texttexttext1el3
texttexttext2text1
texttexttext3text2
texttexttext4text3
texttexttext5el4
texttexttext6el5
texttexttext7el6
texttexttext8el7
texttexttext9el8

А у Bulk-а получилось так:
+
???

id
el2

attributes_1attributes_2idParentId
texttextel3el2

attributes_1attributes_2idParentId
texttextel4el3

attributes_1attributes_2idParentId
texttextel5el4

attributes_1attributes_2idParentId
texttextel6el4

attributes_1idParentId
textel7el6

attributes_1idParentId
textel8el6

attributes_1attributes_2idParentId
texttexttext4text3
texttexttext3NULL

23 окт 09, 18:04    [7831789]     Ответить | Цитировать Сообщить модератору
 Re: Xml bulk load  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Давайте не загружать людей мусором, а за тип char вам уже нельзя помогать (с пробелами сами возитесь). Рабочий код:
USE tempdb

CREATE TABLE dbo.Parent1(id Int PRIMARY KEY);
CREATE TABLE dbo.Parent2(id Int PRIMARY KEY,parent int REFERENCES dbo.Parent1(ID)	,attr SysName);
CREATE TABLE dbo.Repeate(id Int PRIMARY KEY,parent int					,attr SysName);

EXEC <MainDB>.dbo.spSaveToFile 'X:\Path\test.xml', N'<?xml version="1.0" encoding="UTF-16"?>
<root xsi:noNamespaceSchemaLocation="examp.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Parent1 id="1">
    <Repeate id="21">
      <attr>r1</attr>
      <Repeate id="22">
        <attr>r2</attr>
      </Repeate>
    </Repeate>
    <Parent2 id="11">
      <attr>p2</attr>
      <Repeate id="23">
        <attr>r3</attr>
      </Repeate>
    </Parent2>
  </Parent1>
</root>', 1;

EXEC <MainDB>.dbo.spSaveToFile 'X:\Path\test.xsd', N'<?xml version="1.0" encoding="UTF-16"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:annotation>
    <xs:appinfo>
      <sql:relationship name="rel_Parent_1" parent="Parent1" parent-key="id" child="Parent2" child-key="parent"/>
      <sql:relationship name="rel_Repeate1" parent="Parent1" parent-key="id" child="Repeate" child-key="parent"/>
      <sql:relationship name="rel_Repeate2" parent="Parent2" parent-key="id" child="Repeate" child-key="parent"/>
      <sql:relationship name="rel_Repeate" parent="Repeate" parent-key="id" child="Repeate" child-key="parent"/>
    </xs:appinfo>
  </xs:annotation>

  <xs:element name="root" sql:is-constant="1">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Parent1" sql:relation="Parent1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Repeate" sql:relation="Repeate" sql:relationship="rel_Repeate1" type="type_Repeate"/>
              <xs:element name="Parent2" sql:relation="Parent2" sql:relationship="rel_Parent_1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="attr" sql:field="attr"/>
                    <xs:element name="Repeate" sql:relationship="rel_Repeate2" type="type_Repeate"/>
                  </xs:sequence>
                  <xs:attribute name="id" use="required" sql:field="id"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="id" use="required" sql:field="id"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="type_Repeate" >
    <xs:sequence>
      <xs:element name="attr" sql:field="attr"/>
      <xs:element name="Repeate" sql:relation="Repeate" sql:relationship="rel_Repeate" type="type_Repeate" sql:max-depth="50"/>
    </xs:sequence>
    <xs:attribute name="id" use="required" sql:field="id"/>
  </xs:complexType>

</xs:schema>',1;

EXEC <MainDB>.dbo.spXMLBulkLoad 'X:\Path\test.xml','X:\Path\test.xsd', 'tempdb';

SELECT * FROM dbo.Parent1;
SELECT * FROM dbo.Parent2;
SELECT * FROM dbo.Repeate;

DROP TABLE dbo.Repeate;
DROP TABLE dbo.Parent2;
DROP TABLE dbo.Parent1;
Вот решение:

id
1

idparentattr
111p2

idparentattr
211r1
2221r2
2311r3
23 окт 09, 19:46    [7832193]     Ответить | Цитировать Сообщить модератору
 Re: Xml bulk load  [new]
Sharik_
Member

Откуда:
Сообщений: 108
Mnior
Давайте не загружать людей мусором, а за тип char вам уже нельзя помогать (с пробелами сами возитесь). Рабочий код


За пробелы каюсь. Оформление взяла на заметку.

Спасибо за код.
28 окт 09, 10:53    [7848168]     Ответить | Цитировать Сообщить модератору
 Re: Xml bulk load  [new]
Sharik_
Member

Откуда:
Сообщений: 108
Добрый день.
А можно мне еще немного вашей помощи по данному вопросу на все том же примере, но немного усложненном:
<?xml version="1.0" encoding="UTF-16"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Parent1 id="1">
		<Repeate id="21">
			<attr>r1</attr>
			<Repeate id="22">
				<attr>r2</attr>
			</Repeate>
		</Repeate>
		<Repeate id="23">
			<attr>r5</attr>
			<Repeate id="24">
				<attr>r6</attr>
			</Repeate>
		</Repeate>
		<Parent2 id="11">
			<attr>p2</attr>
			<Repeate id="23">
				<attr>r3</attr>
				<Repeate id="24">
					<attr>r4</attr>
				</Repeate>
			</Repeate>
		</Parent2>
	</Parent1>
</root>
В <Repeate id="23"> вложен <Repeate id="24">,
плюс связка <Repeate id="23"> и <Repeate id="24"> вложена в <Parent1 id="1">.

После выполнения bulk load в таблице Repeate:

idparentattr
211r1
2221r2
2311r3
231r5
2423r4
2423r6


То есть получаем ситуацию, что связывая id с его предком вместо двух записей получим четыре(это на примере при id = 24).
Вопрос состоит в том, как бы так вывернуться, чтобы, добавив поле или как-то иначе получить четкое соответствие
что
24,23,r4 это child 23,11,r3
, а
24,23,r6 это child 23,1,r5

Спасибо.
7 ноя 09, 13:21    [7896342]     Ответить | Цитировать Сообщить модератору
 Re: Xml bulk load  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Sharik_
но немного усложненном: ...
Это не усложнённый, это говно код XML.
Но против этого можно попробывать поставить свойство KeepIdentity=False и не забыть поставить в таблицах на ID Identity. Тогда идентификаторы в XML будут игнорироваться и подставляться сгенерированные. Попробуйте, хотя по логике это не поможет.
Модель объектов массовой загрузки XML SQL Server (SQLXML 4.0)
Примеры массовой загрузки XML (SQLXML 4.0)
Доступ к XML и реляционным данным
Но всё равно, за такие данные нужно руки отрывать.
7 ноя 09, 23:36    [7897420]     Ответить | Цитировать Сообщить модератору
 Re: Xml bulk load  [new]
Sharik_
Member

Откуда:
Сообщений: 108
Mnior
Но против этого можно попробывать поставить свойство KeepIdentity=False и не забыть поставить в таблицах на ID Identity. Тогда идентификаторы в XML будут игнорироваться и подставляться сгенерированные. Попробуйте, хотя по логике это не поможет.

Это действительно не помогло.

Спасибо за ваши ответы.
20 ноя 09, 12:57    [7956058]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить