powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вытащить данные из сложной и многоуровневой XML?
25 сообщений из 68, страница 1 из 3
Как вытащить данные из сложной и многоуровневой XML?
    #37741193
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как вытащить данные из сложной и многоуровневой XML?
    #37741209
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTreeНе хочу изобретать велосипед.От версии зависит.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #37741211
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgSandalTreeНе хочу изобретать велосипед.От версии зависит.2008R2
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #37741232
Alexander Karavaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как вытащить данные из сложной и многоуровневой XML?
    #37741288
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37741298
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны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
Как вытащить данные из сложной и многоуровневой XML?
    #37741307
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37741310
Marugr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
старый способ, можно еще используя 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
Как вытащить данные из сложной и многоуровневой XML?
    #37741693
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTreeУ меня в схеме более 30К ...XmlBulkLoad адназначна.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #37742212
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
[/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
Как вытащить данные из сложной и многоуровневой XML?
    #37742226
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37742506
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не реагирует. Повторяю.
Код: sql
1.
EXEC dbo.spXmlBulkLoad 'Z:\Path\Data.xml', 'Z:\Path\Schema.xsd'

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

8075805
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #37747699
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37748263
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37748913
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37749216
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37749651
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37751932
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37752923
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37752994
kDnZP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTree, сейчас придет Mnior, скажет вам какую-нить гадость и будет прав.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #37753245
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37753319
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вытащить данные из сложной и многоуровневой XML?
    #37753539
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTreeВот хай-левел описаловка: http://support.ezclaim.com/ANSIRef/ Это не описалово это муть, так, для вида. Уже подозрительно, но я взглянул поверхностно.
SandalTreeнужно делать маппинг, а я не знаю бизнес логики ни источника ни приёмника.Так в этом и стоит задача. Только в этом!
И вам нужно выбрать стратегию - через какой механизм и как это делать.
Задача предельно чёткая и понятная, конкретная и частная.

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

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

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

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

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

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


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