Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вытащить данные из сложной и многоуровневой XML? / 25 сообщений из 68, страница 1 из 3
05.04.2012, 23:56
    #37741193
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
BEGIN TRAN

DECLARE @idoc INT
DECLARE @xml NVARCHAR(MAX)

SET @xml = '
<Records>
	<Company>
	  <Name>ABC</Name>
	  <Department>
		  <Name>Sales</Name>
		  <Person>
		    <Name>Vasja</Name>
		    <Position>Manager</Position>
		  </Person>
		  <Person>
		    <Name>Olga</Name>
		    <Position>Secretutka</Position>
		  </Person>
	  </Department>
	  <Department>
		  <Name>Transportation</Name>
		  <Person>
		    <Name>Petja</Name>
		    <Position>Vodila</Position>
		  </Person>
		  <Person>
		    <Name>Victor</Name>
		    <Position>Bombila</Position>
		  </Person>
	  </Department>
	</Company>
</Records>
'


EXEC sp_xml_preparedocument @idoc OUTPUT ,@xml 

SELECT * 
FROM OPENXML (@idoc, '/Records/Company',2)
WITH ([Name] VARCHAR(100))

SELECT * 
FROM OPENXML (@idoc, '/Records/Company/Department',2)
WITH ([Name] VARCHAR(100))

SELECT * 
FROM OPENXML (@idoc, '/Records/Company/Department/Person',2)
WITH ([Name] VARCHAR(100), [Position] VARCHAR(100))

EXEC sp_xml_removedocument @idoc 

ROLLBACK



Хочу получить что-то вроде этого:

Company Department Person PositionABC Sales Olga SecretutkaABC Sales Vasja ManagerABC Transportation Petja VodilaABC Transportation Victor Bombila

Не хочу изобретать велосипед.
У меня в схеме более 30К строк, до 6 уровней вложения, а количество полей порядка 1600.

Кто-то делал такое?
...
Рейтинг: 0 / 0
06.04.2012, 00:10
    #37741209
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTreeНе хочу изобретать велосипед.От версии зависит.
...
Рейтинг: 0 / 0
06.04.2012, 00:13
    #37741211
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
alexeyvgSandalTreeНе хочу изобретать велосипед.От версии зависит.2008R2
...
Рейтинг: 0 / 0
06.04.2012, 00:52
    #37741232
Alexander Karavaev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTree, может быть пройтись по схеме и сформировать селект вида
Код: sql
1.
2.
3.
4.
5.
select  x.value('parent::Department[1]/parent::Company[1]/Name[1]', 'varchar(100)'), 
x.value('parent::Department[1]/Name[1]', 'varchar(100)'), 
x.value('Name[1]', 'varchar(100)'),
x.value('Position[1]', 'varchar(100)')
from @xml.nodes('/Records/Company/Department/Person') r(x)

?
...
Рейтинг: 0 / 0
06.04.2012, 03:57
    #37741288
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTreeУ меня в схеме более 30К строк, до 6 уровней вложения, а количество полей порядка 1600.
Так что в итоге нужно? 6 уровней вложения? - это company внутри company? department внутри department? person внутри person?) Или нужно просто вытащить содержимое нод person, и для них - значения company и department от parent (ancestor) нод?
Остальные 1600-4 = 1596 полей к какому типу нод (company/department/person) относятся?
В общем, опишите задачу точнее.
Если просто персоны, и для них - компания/отдел, в которых они состоят (без упомянутых выше вложений) - то как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare
  @x xml;
set @x=N' [текст xml] '
select
  t.n.query('Name/text()').value('.', 'varchar(10)') company_name,
  t1.n.query('Name/text()').value('.', 'varchar(10)') dept_name,
  t2.n.query('Name/text()').value('.', 'varchar(10)') person_name,
  t2.n.query('Position/text()').value('.', 'varchar(10)') person_position
from
  @x.nodes('//Company') t(n)
  cross apply t.n.nodes('Department') t1(n)
  cross apply t1.n.nodes('Person') t2(n)
...
Рейтинг: 0 / 0
06.04.2012, 05:40
    #37741298
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
Сон Веры ПавловныSandalTreeУ меня в схеме более 30К строк, до 6 уровней вложения, а количество полей порядка 1600.
Так что в итоге нужно? 6 уровней вложения? - это company внутри company? department внутри department? person внутри person?) Или нужно просто вытащить содержимое нод person, и для них - значения company и department от parent (ancestor) нод?
Остальные 1600-4 = 1596 полей к какому типу нод (company/department/person) относятся?
В общем, опишите задачу точнее.
Если просто персоны, и для них - компания/отдел, в которых они состоят (без упомянутых выше вложений) - то как-то так:
Мой кусок кода это просто пример для извращений.

На самом деле всё гооораздо сложнее. Уровни вложения могут различаться в различных нодах и всё может повторяться или нет.
Запостил-бы сюда xsd, но он больше 30000 строк.
...
Рейтинг: 0 / 0
06.04.2012, 06:48
    #37741307
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTreeМой кусок кода это просто пример для извращений.
На самом деле всё гооораздо сложнее. Уровни вложения могут различаться в различных нодах и всё может повторяться или нет.
Запостил-бы сюда xsd, но он больше 30000 строк.
Я тогда бы всё-таки применил к вашему XML XSLT. Для именно приведенного в стартовом постинге - что-то типа
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?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="/">
    <xsl:for-each select="//Person">
      <xsl:element name="Person">
        <xsl:attribute name="Name">
          <xsl:value-of select="Name/text()"/>
        </xsl:attribute>
        <xsl:attribute name="Position">
          <xsl:value-of select="Position/text()"/>
        </xsl:attribute>
        <xsl:attribute name="Department">
          <xsl:value-of select="parent::node()/Name/text()"/>
        </xsl:attribute>
        <xsl:attribute name="Company">
          <xsl:value-of select="ancestor::Company/Name/text()"/>
        </xsl:attribute>
      </xsl:element>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>


и тогда на выходе получится такой нодесет:
Код: xml
1.
2.
3.
4.
<Person Name="Vasja" Position="Manager" Department="Sales" Company="ABC" />
<Person Name="Olga" Position="Secretutka" Department="Sales" Company="ABC" />
<Person Name="Petja" Position="Vodila" Department="Transportation" Company="ABC" />
<Person Name="Victor" Position="Bombila" Department="Transportation" Company="ABC" />


который уже можно будет легко залить с помощью того же openxml (по моим наблюдениям, он работает быстрее, чем XQuery).
Ну, а для вашего случая "на самом деле" XSLT будет выглядеть как-то иначе.
...
Рейтинг: 0 / 0
06.04.2012, 07:02
    #37741310
Marugr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
старый способ, можно еще используя xPath но замороченей
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
create PROCEDURE [dbo].[xml_in]
	@xml text 
AS
BEGIN
	SET NOCOUNT ON;
	
DECLARE @idoc INT


SET @xml = /* для пробы, в рабочей версии убрать*/
'<Records>
	<Company>
	  <Name>ABC</Name>
	  <Department>
		  <Name>Sales</Name>
		  <Person>
		    <Name>Vasja</Name>
		    <Position>Manager</Position>
		  </Person>
		  <Person>
		    <Name>Olga</Name>
		    <Position>Secretutka</Position>
		  </Person>
	  </Department>
	  <Department>
		  <Name>Transportation</Name>
		  <Person>
		    <Name>Petja</Name>
		    <Position>Vodila</Position>
		  </Person>
		  <Person>
		    <Name>Victor</Name>
		    <Position>Bombila</Position>
		  </Person>
	  </Department>
	</Company>
</Records>
'


EXEC sp_xml_preparedocument @idoc OUTPUT ,@xml 
SELECT    *
FROM       OPENXML (@idoc, N'//Records/Company/Department/Person',8) /*лезем на самый глубокий уровень вложенности*/
      WITH ( 
            Company char(10) '../../Name',
            Department char(15) '../Name',
            Person char(20) 'Name',
            Position char(15) 'Position'
            )

EXEC sp_xml_removedocument @iDoc

END
...
Рейтинг: 0 / 0
06.04.2012, 12:07
    #37741693
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTreeУ меня в схеме более 30К ...XmlBulkLoad адназначна.
...
Рейтинг: 0 / 0
06.04.2012, 16:00
    #37742212
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
Сон Веры Павловны
[/src]
и тогда на выходе получится такой нодесет:
Код: xml
1.
2.
3.
4.
<Person Name="Vasja" Position="Manager" Department="Sales" Company="ABC" />
<Person Name="Olga" Position="Secretutka" Department="Sales" Company="ABC" />
<Person Name="Petja" Position="Vodila" Department="Transportation" Company="ABC" />
<Person Name="Victor" Position="Bombila" Department="Transportation" Company="ABC" />


который уже можно будет легко залить с помощью того же openxml (по моим наблюдениям, он работает быстрее, чем XQuery).
Ну, а для вашего случая "на самом деле" XSLT будет выглядеть как-то иначе.То что я привёл в виде примера, это не сама задача, а просто что-то маленькое, очень похожее на большое. Я не могу менять схему, она ко мне приходит готовая, а я уже должен её принять.
...
Рейтинг: 0 / 0
06.04.2012, 16:09
    #37742226
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
Marugrстарый способ, можно еще используя xPath но замороченей
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
EXEC sp_xml_preparedocument @idoc OUTPUT ,@xml 
SELECT    *
FROM       OPENXML (@idoc, N'//Records/Company/Department/Person',8) /*лезем на самый глубокий уровень вложенности*/
      WITH ( 
            Company char(10) '../../Name',
            Department char(15) '../Name',
            Person char(20) 'Name',
            Position char(15) 'Position'
            )

EXEC sp_xml_removedocument @iDoc

END

Спасибо, очень красиво, но у меня проблема в том что одни и те-же названия могут применяться на одном и том-же уровне вложености:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<Records>
	<Company>
	  <Name>ABC</Name>
	  <Department>
		  <Name>Sales</Name>
		  <Person>
		    <Name>Vasja</Name>
		    <Position>Manager</Position>
		  </Person>
		  <Person>
		    <Name>Olga</Name>
		    <Position>Secretutka</Position>
		  </Person>
	  </Department>
	  <Department>
		  <Name>Transportation</Name>
		  <Person>
		    <Name>Petja</Name>
		    <Position>Vodila</Position>
		  </Person>
		  <Person>
		    <Name>Victor</Name>
		    <Position>Bombila</Position>
		  </Person>
	  </Department>
	  <Founders>
	    <Founder>
		    <Name>Kolja</Name>
  	  </Founder>
	    <Founder>
		    <Name>Borja</Name>
  	  </Founder>
	    <Founder>
		    <Name>Misha</Name>
  	  </Founder>
	  </Founders>
	</Company>
</Records>



Буду сейчас пробовать метод Alexanderа Karavaevа.
Я видел в инете подобные примеры, но так не понимаю как он работает.
Но если дело что мне надо, то тогда на нём и остановлюсь.
...
Рейтинг: 0 / 0
06.04.2012, 18:53
    #37742506
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
Не реагирует. Повторяю.
Код: sql
1.
EXEC dbo.spXmlBulkLoad 'Z:\Path\Data.xml', 'Z:\Path\Schema.xsd'

Одна команда и все данные записаны во все таблицы зразу.

8075805
...
Рейтинг: 0 / 0
10.04.2012, 22:59
    #37747699
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
MniorНе реагирует. Повторяю.
Код: sql
1.
EXEC dbo.spXmlBulkLoad 'Z:\Path\Data.xml', 'Z:\Path\Schema.xsd'

Одна команда и все данные записаны во все таблицы зразу.

8075805

авторMsg 15281, Level 16, State 1, Procedure sp_OACreate, Line 1
SQL Server blocked access to procedure 'sys.sp_OACreate' of component 'Ole Automation Procedures' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ole Automation Procedures' by using sp_configure. For more information about enabling 'Ole Automation Procedures', see "Surface Area Configuration" in SQL Server Books Online.
Msg 50000, Level 18, State 1, Procedure spXMLBulkLoad, Line 48
Error of execution method "SQLXMLBulkLoad.SQLXMLBulkload" в "sp_OACreate": Error Creation OLE object

Как я понял, стандартные решения не катят, ибо даже после того как я успешно распарсил файл, он у меня вылил все данные в одну строку. И этого можно было ожидать, так как мне пришлось все поля сделать уникальными, иначе повторы имён выдавали ошибку. А так как уровни вложености и ноды у одинаковых имён различны, то сгруппировать по сторокам не представляется никакой возможности.
Наверное можно что-то ручками сделать, но я-бы не старался.
...
Рейтинг: 0 / 0
11.04.2012, 12:10
    #37748263
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTreeMsg 15281, Level 16, State 1, Procedure sp_OACreate, Line 1Ага, а в первой же строке в процедуре английским по белому:
Код: sql
1.
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;

Специально для лентяев.

SandalTreeКак я понял, стандартные решения не катятКатят.
SandalTreeон у меня вылил все данные в одну строку.Неправильно отструктуировали.
SandalTreeмне пришлось все поля сделать уникальными, иначе повторы имён выдавали ошибкуС какого перепугу.
SandalTreeА так как уровни вложености и ноды у одинаковых имён различны, то сгруппировать по сторокам не представляется никакой возможности.Ну тогда оторвите руки тому кто делал формат данного малополезного документа.
Чёта я по формату документа не вижу совершенно никаких дублей. Или там на полставки работают в разных департаментах? Ну дык укажите тока основной.
...
Рейтинг: 0 / 0
11.04.2012, 16:12
    #37748913
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
MniorЧёта я по формату документа не вижу совершенно никаких дублей. Или там на полставки работают в разных департаментах? Ну дык укажите тока основной.
Вот. Нарисуй мне результат запроса из этого ХМЛа.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<Records>
	<Company>
	  <Name>ABC</Name>
	  <Department>
		  <Name>Sales</Name>
		  <Person>
		    <Name>Vasja</Name>
		    <Position>Manager</Position>
		  </Person>
		  <Person>
		    <Name>Olga</Name>
		    <Position>Secretutka</Position>
		  </Person>
	  </Department>
	  <Department>
		  <Name>Transportation</Name>
		  <Person>
		    <Name>Petja</Name>
		    <Position>Vodila</Position>
		  </Person>
		  <Person>
		    <Name>Victor</Name>
		    <Position>Bombila</Position>
		  </Person>
	  </Department>
	  <Founders>
	    <Founder>
		    <Name>Kolja</Name>
  	  </Founder>
	    <Founder>
		    <Name>Borja</Name>
  	  </Founder>
	    <Founder>
		    <Name>Misha</Name>
  	  </Founder>
	  </Founders>
	</Company>
</Records>
...
Рейтинг: 0 / 0
11.04.2012, 19:18
    #37749216
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTreeВот. Нарисуй мне результат запроса из этого ХМЛа.Какого навиг запроса?
Запускаю:
Код: sql
1.
EXEC dbo.spXmlBulkLoad 'Z:\Path\Data.xml', 'Z:\Path\Schema.xsd'


В результате в 3х таблицах появились записи:
dbo.Company:NameABCdbo.Department:CompanyNameABCSalesABCTransportationdbo.Person:DepartmentNamePositionSalesVasjaManagerSalesOlgaSecretutkaTransportationPetjaVodilaTransportationVictorBombila

Ну в зависимости как вы расписали схему таблиц и XSD. Например вместо имён подставились автоинкрементные поля.
...
Рейтинг: 0 / 0
12.04.2012, 07:09
    #37749651
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
MniorSandalTreeВот. Нарисуй мне результат запроса из этого ХМЛа.Какого навиг запроса?
Запускаю:
Код: sql
1.
EXEC dbo.spXmlBulkLoad 'Z:\Path\Data.xml', 'Z:\Path\Schema.xsd'


В результате в 3х таблицах появились записи:
dbo.Company:NameABCdbo.Department:CompanyNameABCSalesABCTransportationdbo.Person:DepartmentNamePositionSalesVasjaManagerSalesOlgaSecretutkaTransportationPetjaVodilaTransportationVictorBombila

Ну в зависимости как вы расписали схему таблиц и XSD. Например вместо имён подставились автоинкрементные поля.Забыл про четвёртую - "основатели"...
Но в том-то и фикус что в таком маленьком хмльчике уместились данные аж для четверых таблиц.
А представь если там 1600 позиций... Брошу я это дело как неподъёмное. Нефиг на мне ездить.
Пущай в джаве парсють, а мне только чистые данные кидают.
...
Рейтинг: 0 / 0
13.04.2012, 11:04
    #37751932
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTreeА представь если там 1600 позиций... Брошу я это дело как неподъёмное.Слабак:

Ищем в гугле "xsd generator online".
Находим это
Подставлям свой XML
+
Получаем XSD
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
<?xml version="1.0"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Records">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Company">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Name" type="xsd:string" />
              <xsd:element maxOccurs="unbounded" name="Department">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="Name" type="xsd:string" />
                    <xsd:element maxOccurs="unbounded" name="Person">
                      <xsd:complexType>
                        <xsd:sequence>
                          <xsd:element name="Name" type="xsd:string" />
                          <xsd:element name="Position" type="xsd:string" />
                        </xsd:sequence>
                      </xsd:complexType>
                    </xsd:element>
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="Founders">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element maxOccurs="unbounded" name="Founder">
                      <xsd:complexType>
                        <xsd:sequence>
                          <xsd:element name="Name" type="xsd:string" />
                        </xsd:sequence>
                      </xsd:complexType>
                    </xsd:element>
                  </xsd:sequence>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Согласно документации (найденой по XSD annotation site:microsoft.com) подставляем связки с таблами по уже имеющейся у вас схеме БД.
+
Имеем схему таблиц
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
CREATE TABLE dbo.Company (
	 ID	Int	IDENTITY
	 CONSTRAINT [PK_Company] PRIMARY KEY
	,Name	VarChar(50)	NOT NULL
)
CREATE TABLE dbo.Department (
	 ID		Int	IDENTITY
	 CONSTRAINT [PK_Department] PRIMARY KEY
	,Name		VarChar(50)	NOT NULL
	,Company	Int		NOT NULL
	 CONSTRAINT [FK_Department_Company] REFERENCES dbo.Company (ID)
)
CREATE TABLE dbo.Person (
	 ID		Int	IDENTITY
	 CONSTRAINT [PK_Person] PRIMARY KEY
	,Name		VarChar(50)	NOT NULL
	,Position	VarChar(50)	NOT NULL
	,Department	Int		NOT NULL
	 CONSTRAINT [FK_Person_Department] REFERENCES dbo.Department (ID)
)
GO
CREATE TABLE dbo.Founder (
	 ID		Int	IDENTITY
	 CONSTRAINT [PK_Founder] PRIMARY KEY
	,Name		VarChar(50)	NOT NULL
	,Company	Int		NOT NULL
	 CONSTRAINT [FK_Founder_Company] REFERENCES dbo.Company (ID)
)
GO

Модифицируем XSD под эту схему (связываем тэги с таблами):+
XSD with SQL Annotation
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
<?xml version="1.0"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
 <xsd:annotation>
  <xsd:appinfo>
   <sql:relationship name="FK_Department_Company" parent="dbo.Company" parent-key="ID" child="dbo.Department" child-key="Company" />
   <sql:relationship name="FK_Person_Department" parent="dbo.Department" parent-key="ID" child="dbo.Person" child-key="Department" />
   <sql:relationship name="FK_Founder_Company" parent="dbo.Company" parent-key="ID" child="dbo.Founder" child-key="Company" />
  </xsd:appinfo>
 </xsd:annotation>

 <xsd:element name="Records" sql:is-constant="1">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="Company" sql:relation="dbo.Company" sql:key-fields="ID">
     <xsd:complexType>
      <xsd:sequence>
       <xsd:element name="Name" type="xsd:string" />
       <xsd:element maxOccurs="unbounded" name="Department" sql:relation="dbo.Department" sql:relationship="FK_Department_Company" sql:key-fields="ID">
        <xsd:complexType>
         <xsd:sequence>
          <xsd:element name="Name" type="xsd:string" />
          <xsd:element maxOccurs="unbounded" name="Person" sql:relation="dbo.Person" sql:relationship="FK_Person_Department">
           <xsd:complexType>
            <xsd:sequence>
             <xsd:element name="Name" type="xsd:string" />
             <xsd:element name="Position" type="xsd:string" />
            </xsd:sequence>
           </xsd:complexType>
          </xsd:element>
         </xsd:sequence>
        </xsd:complexType>
       </xsd:element>
       <xsd:element name="Founders" sql:is-constant="1">
        <xsd:complexType>
         <xsd:sequence>
          <xsd:element maxOccurs="unbounded" name="Founder" sql:relation="dbo.Founder" sql:relationship="FK_Founder_Company">
           <xsd:complexType>
            <xsd:sequence>
             <xsd:element name="Name" type="xsd:string" />
            </xsd:sequence>
           </xsd:complexType>
          </xsd:element>
         </xsd:sequence>
        </xsd:complexType>
       </xsd:element>
      </xsd:sequence>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>

Далее запускаем:
Код: sql
1.
EXEC SomeDB.dbo.spXmlBulkLoad 'Z:\Path\Test.xml', 'Z:\Path\Test.xsd', 'tempdb', 0

+
Результат
Код: sql
1.
2.
3.
4.
SELECT * FROM dbo.Company
SELECT * FROM dbo.Department
SELECT * FROM dbo.Person
SELECT * FROM dbo.Founder

IDName1ABC

IDNameCompany1Sales12Transportation1
IDNamePositionDepartment1VasjaManager12OlgaSecretutka13PetjaVodila24VictorBombila2
IDNameCompany1Kolja12Borja13Misha1+
ЗамечанияВ указанной на форуме процедуре отсутствует необходимая для данного случая (подстановка Identity) строка:
Код: sql
1.
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'KeepIdentity'	,0			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'KeepIdentity'	GOTO Error END

В моём случае задаётся 4-м параметром (по умолчанию 1)
...
Рейтинг: 0 / 0
13.04.2012, 16:31
    #37752923
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
Mnior,

Ну конечно, слабак.
В моём примере бизнес логика самая наипростейшая, вытянуть данные ничего не стоит.

Оказалось что проблема вовсе не в выковыривании данных, а в понимании этой самой бизнес логики.

Ты расковырял простенький XSD в 50 строк на четыре таблички. Сможешь так-же просто сделать это с файлом в 600 раз больше?

Если сможешь, то тогда вопрос: у тебя есть Н1В?

И кстати, процедуру твою я игнорировал, севрер ругается на вот эти системки:
sys.sp_OACreate
sys.sp_OASetProperty

Говорит:
Msg 15281, Level 16, State 1, Procedure sp_OASetProperty, Line 1
SQL Server blocked access to procedure 'sys.sp_OASetProperty' of component 'Ole Automation Procedures' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ole Automation Procedures' by using sp_configure. For more information about enabling 'Ole Automation Procedures', see "Surface Area Configuration" in SQL Server Books Online.


А, вообще, снимаю шляпу перед твоей настойчивостью.
...
Рейтинг: 0 / 0
13.04.2012, 17:02
    #37752994
kDnZP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTree, сейчас придет Mnior, скажет вам какую-нить гадость и будет прав.
...
Рейтинг: 0 / 0
13.04.2012, 19:01
    #37753245
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTreeВ моём примере бизнес логика самая наипростейшая, вытянуть данные ничего не стоит.Вообщето я понял. Возможно вы и правы (тады не понятно зачем вообще вы поднимали топик; но критичекое отношение к задаче - бальзам на душу), только не очень понятна ситуация в целом (мысли ваши не читаем) противоречива:
- нужно данные вытянуть
- структура неизвесна и предположительно заранее отсутствует
Это как ? Куда данные выковыривать, и зачем?!

SandalTreeСможешь так-же просто сделать это с файлом в 600 раз больше?Ты наверно имел ввиду не файл больше, а структура сложнее. Размер тут не причём.
Если структура статично, то XSD делается один раз.
Если структура в БД определена (имеются таблы) и она консестивна согласована с XML, то XSD генерируешь на основании этих метаданных.

SandalTreeИ кстати, процедуру твою я игнорировал, севрер ругается на вот эти системки:
sys.sp_OACreate
sys.sp_OASetPropertyСлоупок?: 12398244
MniorАга, а в первой же строке в процедуре английским по белому:
Код: sql
1.
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;

Специально для лентяев.
...
Рейтинг: 0 / 0
13.04.2012, 19:51
    #37753319
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
MniorSandalTreeВ моём примере бизнес логика самая наипростейшая, вытянуть данные ничего не стоит.Вообщето я понял. Возможно вы и правы (тады не понятно зачем вообще вы поднимали топик; но критичекое отношение к задаче - бальзам на душу), только не очень понятна ситуация в целом (мысли ваши не читаем) противоречива:
- нужно данные вытянуть
- структура неизвесна и предположительно заранее отсутствует
Это как ? Куда данные выковыривать, и зачем?! XSD есть, но он настолько велик что человеку "с улицы" не обьять необьятное. Вот хай-левел описаловка: http://support.ezclaim.com/ANSIRef/

MniorSandalTreeСможешь так-же просто сделать это с файлом в 600 раз больше?Ты наверно имел ввиду не файл больше, а структура сложнее. Размер тут не причём.
Если структура статично, то XSD делается один раз.
Если структура в БД определена (имеются таблы) и она консестивна согласована с XML, то XSD генерируешь на основании этих метаданных.XSD и структура таблиц увы не согласованы, т.е. нужно делать маппинг, а я не знаю бизнес логики ни источника ни приёмника.

MniorSandalTreeИ кстати, процедуру твою я игнорировал, севрер ругается на вот эти системки:
sys.sp_OACreate
sys.sp_OASetPropertyСлоупок?: 12398244
MniorАга, а в первой же строке в процедуре английским по белому:
Код: sql
1.
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;

Специально для лентяев.Ну так я это понимаю, но у меня нет власти над серваком.
...
Рейтинг: 0 / 0
13.04.2012, 22:53
    #37753539
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTreeВот хай-левел описаловка: http://support.ezclaim.com/ANSIRef/ Это не описалово это муть, так, для вида. Уже подозрительно, но я взглянул поверхностно.
SandalTreeнужно делать маппинг, а я не знаю бизнес логики ни источника ни приёмника.Так в этом и стоит задача. Только в этом!
И вам нужно выбрать стратегию - через какой механизм и как это делать.
Задача предельно чёткая и понятная, конкретная и частная.

Берётся и исследуется мапинг. Глазками. Представив перед этим структуры (то УГ) в человеческих вид.
Если он линейный/однозначный, что хватает в XSD тупо замапировать - то это халява.
А вот если бизнес структуры предельно не связаны, то тут море кода. И где его делать надо решать, через полноценное исследование вариантов. Всё зависит от архитектуры взаимодействия:
Потоковая обработка Event-ов или закачка Diff-ов. Где-то лучше нативным кодом, а где скриптами.
Но в случае сложной связки обязательно ставится вопрос, а оно надо, а может мы не тем занимаемся и т.п. Застраховаться так сказать заведомо, от неминуемого фаталити. Т.к. это жжж не спроста.

Mniorу меня нет власти над серваком.У меня тоже нет, прямой, и шо?! Есть требования, притом обоснованные.
Или вы росли в глуши и люди у вас вызывают панический страх?
...
Рейтинг: 0 / 0
16.04.2012, 15:57
    #37755684
SandalTree
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
MniorSandalTreeВот хай-левел описаловка: http://support.ezclaim.com/ANSIRef/ Это не описалово это муть, так, для вида. Уже подозрительно, но я взглянул поверхностно.
О! А мне это попытались всунуть вместо спецификации.

MniorУ меня тоже нет, прямой, и шо?! Есть требования, притом обоснованные.
Или вы росли в глуши и люди у вас вызывают панический страх?Ты местную бюрократию не знаешь. Я что крайний что-ли по инстанциям ходить. Инициатива очень строго наказуема. (по крайней мере, пока проект не горит)
...
Рейтинг: 0 / 0
16.04.2012, 23:32
    #37756265
Mnior
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вытащить данные из сложной и многоуровневой XML?
SandalTreeТы местную бюрократию не знаешь. Я что крайний что-ли по инстанциям ходить. Инициатива очень строго наказуема. (по крайней мере, пока проект не горит)Я знаю очень хорошо то что люди очень много болтают подобным образом и при этом ничего , никогда не пробовали сделать.
Но самое прискорбное, что когда в очередной 100500 раз явно показываешь, что все нормально можно "пробить" за 2 секунды, то до мозгов это не доходит. Это диагноз, а не бюрократия.
Да есть случаи, но "обход" очень часто находится.

Как раз когда "не горит" это и делается.

Кста, по запросу "837 XSD" что-то ловиться .
Только сделайте качественный поиск и анализ.

PS: Если бюрократия реально непробиваема (редкий случай). Найдите себе достойную работу. Можете с шефом это осудить. Не холопы же вы. Или нет?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вытащить данные из сложной и многоуровневой XML? / 25 сообщений из 68, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]