powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вытащить данные из сложной и многоуровневой XML?
68 сообщений из 68, показаны все 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
Как вытащить данные из сложной и многоуровневой XML?
    #37756434
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MniorSandalTreeТы местную бюрократию не знаешь. Я что крайний что-ли по инстанциям ходить. Инициатива очень строго наказуема. (по крайней мере, пока проект не горит)Я знаю очень хорошо то что люди очень много болтают подобным образом и при этом ничего , никогда не пробовали сделать.
Но самое прискорбное, что когда в очередной 100500 раз явно показываешь, что все нормально можно "пробить" за 2 секунды, то до мозгов это не доходит. Это диагноз, а не бюрократия.
Да есть случаи, но "обход" очень часто находится.

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

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

PS: Если бюрократия реально непробиваема (редкий случай). Найдите себе достойную работу. Можете с шефом это осудить. Не холопы же вы. Или нет?Да ладно тебе. Люди болтают...
Сегодня у нас делал презентацию по XQuery бывший сотрудник мелкософта.
Я к нему подкатил со своим вопросом, он сказал что есть 2 варианта:
1. Разбирать XML/XSD ручками, на что потребуется немеряный героизм и куева туча времени и возможно, проведя кост анализ вам этого совсем не захочется делать.
2. Сохранить все данные в XML поле и тянуть оттуда данные по надобности через XQuery. Тут тоже нехилая проблема с написанием всех запросов и прочего... логики будет вагон и маленькая тележка.

Я и так по 12-14 часов в день работаю, я что, лысый что-ли на себя ещё груз брать?
Тут дело даже не в лени или ещё чём-то там, просто не хочу гробить 2 месяца своей драгоценной жизни на какую-то муйню, которая возможно через год поменяется и то что я делал улетит коню под хвост.

ЗЫ Я твою прогу на домашнем компе ещё не тестировал, всё времени нет. Как протестирую отпишусь.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #37756551
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTree , что-то ты через строку читаешь:
MniorКста, по запросу "837 XSD" что-то ловиться .
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #37759320
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mnior SandalTree , что-то ты через строку читаешь:
MniorКста, по запросу "837 XSD" что-то ловиться .И?

Ты открывал эти файлы? Видел что там?

Так вот оно у меня есть.
Как я понял, нужен тупой маппинг между XSD и таблицами в базе, ну и конечно-же куева туча рабочего времени.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #37760519
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTreeТы открывал эти файлы? Видел что там?Ну XSD. А вы хотели что я всё разжевал как сосунку?
SandalTreeТак вот оно у меня есть .
Как я понял, нужен тупой маппинг между XSD и таблицами в базе , ну и конечно-же куева туча рабочего времени.Акуеть.
Лень не знает ограниений.

Альберт ошибался, вторая бесконечность - это не про вселенную.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #37778523
Фотография SandalTree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MniorSandalTreeТы открывал эти файлы? Видел что там?Ну XSD. А вы хотели что я всё разжевал как сосунку?
SandalTreeТак вот оно у меня есть .
Как я понял, нужен тупой маппинг между XSD и таблицами в базе , ну и конечно-же куева туча рабочего времени.Акуеть.
Лень не знает ограниений.

Альберт ошибался, вторая бесконечность - это не про вселенную.Дело не во времени, а в том что нужно его правильно рассчитывать. Вот вам не лень, вы и парсте вручную 30К строк, а я в это время на Багамах отдохну.

Ценить нужно своё время, а не тупо работать.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #37778960
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SandalTreeВот вам не лень, вы и парсте вручную 30К строк, а я в это время на Багамах отдохну.1. 30K вы загнули. Там всего-то 100 колонок за день без проблем.
2. Не надо каждую букву парсить глазами, а только замапить. Если система сходится на большую чать то вообще можно одним запросом сделать. Если нет, то двумя.
4. У страха глаза велики
5. Это уже полный песец. Если таких как вы будет 30% - *опа нашему мирку на этой планете.
6. Можете перепоручить это кому-нибуть с не отрицательным терпением. Хоть жене.

Нахлебник.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #38026919
wvadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mnior, пытаюсь грузить XML в базу по методу, описанному Вами в 12410359 .

XML:
Код: xml
1.
2.
3.
4.
<?xml version="1.0" encoding="windows-1251"?>
<getInvoiceReply>
<invoiceID value="279262762"/>
</getInvoiceReply>



XSD:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="utf-16"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
   <xsd:element name="getInvoiceReply" sql:relation="dbo.Invoice" sql:key-fields="ID">
      <xsd:complexType>
	 <xsd:sequence>
	      <xsd:element name="invoiceID">
		   <xsd:complexType>
			<xsd:attribute name="value" type="xsd:int" sql:field="invoiceID"/>
		   </xsd:complexType>
	      </xsd:element>
	  </xsd:sequence>
      </xsd:complexType>
  </xsd:element>
</xsd:schema>



Таблица в БД:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE dbo.Invoice
(
    ID			INT IDENTITY(1,1)	NOT NULL
  , CreateDate	DATETIME		NOT NULL DEFAULT(GETDATE())
  , LastModified	DATETIME		NULL
  , invoiceID	NT			NULL
)

ALTER TABLE dbo.Invoice ADD CONSTRAINT
	PK_Invoice PRIMARY KEY CLUSTERED 
	(ID) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]



Имеем MSSQL2012 + SQLXML 4.0 SP1

Загружаем:
Код: sql
1.
2.
3.
4.
EXEC EData.dbo.spXMLBulkLoad 
    @@File = 'C:\spXMLBulkLoad\test_xml.xml'
  , @@Schema = 'C:\spXMLBulkLoad\test_xsd.xsd'
  , @@DataBase = 'EtranData'



Получаем ошибку:
Код: sql
1.
2.
3.
(1 row(s) affected)
Msg 50000, Level 18, State 1, Procedure spXMLBulkLoad, Line 61
Ошибка при выполнении метода "Execute" в "C:\spXMLBulkLoad\XMLBulkError.xml": Schema: relationship expected on 'invoiceID'. 



В чем может быть проблема?
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #38028826
wvadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и еще вопрос - работает ли SQLXMLBulkLoad на апдейт при попытке сохранения данных с уже существующим ключом?
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #38028854
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvadik,
а где часть авторXSD with SQL Annotation
из ответа Как вытащить данные из сложной и многоуровневой XML?
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #38028859
wvadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в моем сообщении 13427070 XSD сразу указана с sql-аннотацией
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #38028860
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvadikSQLXMLBulkLoad
А БОЛ самому прочесть слабо ,или обязы Mnior для етого нужен

XML Bulk Load can operate in either a transacted or a nontransacted mode. Performance is usually optimal if you are bulk loading in a nontransacted mode: that is, the Transaction property is set to FALSE) and either of the following conditions is true:

*

The tables into which the data is bulk loaded are empty with no indexes.
*

The tables have data and unique indexes.

The nontransacted approach does not guarantee a rollback if something goes wrong in the bulk load process (although partial rollbacks can happen). The nontransacted bulk load is appropriate when the database is empty. Therefore, if something does go wrong, you can clean the database and start XML Bulk Load again.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #38028869
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvadikв моем сообщении 13427070 XSD сразу указана с sql-аннотацией
Ответ от Mnior
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
<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>


Ваш вариант
Код: sql
1.
 <xsd:element name="getInvoiceReply" sql:relation="dbo.Invoice" sql:key-fields="ID">



помоему все таки разный
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #38028944
wvadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaxxwvadikSQLXMLBulkLoad
А БОЛ самому прочесть слабо ,или обязы Mnior для етого нужен

в данном случае речь идет о производительности и транзакциях. у меня стоит задача поставить этот компонент в работу на поток и грузить данные и новый и которые уже существуют в БД, производя полный их апдейт.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #38028961
wvadik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxxwvadikв моем сообщении 13427070 XSD сразу указана с sql-аннотацией
Ваш вариант
Код: sql
1.
 <xsd:element name="getInvoiceReply" sql:relation="dbo.Invoice" sql:key-fields="ID">



помоему все таки разный
проблема не в установлении связей между несколькими таблицами, а расстановке правильных sql:заметок в xsd аннотации для случаев, когда данные хранятся в единственном атрибуте элементов:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<getInvoiceReply>
   <invoiceID value="123"/>
   <invoiceStateID value="89"/>
   <invoiceState value="Испорчен"/>
   <invLastOper value="27.06.2012 16:08:34"/>
.........
</getInvoiceReply>



Чтобы загрузить как:
invoiceIDinvoiceStateIDinvoiceStateinvLastOper12389Испорчен27.06.2012_16:08:34
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #38028987
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы сие смотрели ?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как вытащить данные из сложной и многоуровневой XML?
    #39935758
_kpoIIIka eHoT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые форумчане.
Не хочется плодить похожие темы, апну старую.
Заранее прошу прощения за возможно глупый вопрос, но только недавно начал изучать SQLXMLBulkLoad как способ импорта XML файлов.
В сообщении 12410359 все подробно описано и замечательно работает, но как быть, если внутри родительского тэга <Records> </Records> появится еще один ребенок <Country> </Country>. Как в этом случае прописать связи sql:relationship между <Company> и <Country>
пример xml
Код: 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.
<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>

<Country>
<Name>Russia</Name>
</Country>

</Records>




По аналогии c примером создаю таблицу Country c колонками Name и Company (CONSTRAINT [FK_Country_Company] REFERENCES dbo.Company (ID))
Код: xml
1.
<sql:relationship name="FK_Country_Company" parent="dbo.Company" parent-key="ID" child="dbo.Country" child-key="Company" />


выдает ошибку "No data was provided for column 'Company' on table 'dbo.Country', and this column cannot contain NULL values."
Помогите пожалуйста советом, уже неприлично долго пытаюсь победить данную проблему.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935794
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хде ж у тя, страдалец, в тоей хамээлине ID?

ЗЫ. А ежели у тя там будет десяток Company и пяток Country. Чаво будем делать?
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935800
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_kpoIIIka eHoT
В сообщении 12410359 все подробно описано и замечательно работает, но как быть, если внутри родительского тэга <Records> </Records> появится еще один ребенок <Country> </Country>. Как в этом случае прописать связи sql:relationship между <Company> и <Country>
У вас же Country добавлен не как ребёнок Company, соответственно, откуда между ними могут быть связи?
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935811
_kpoIIIka eHoT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Хде ж у тя, страдалец, в тоей хамээлине ID?

В скрипте указываю KeepIdentity = false и при импорте ID сервер генерирует ключ

aleks222
ЗЫ. А ежели у тя там будет десяток Company и пяток Country. Чаво будем делать?

В одном xml файле Company и Country встречаются по одному разу, но при пакетном импорте файлов, их соответственно будет много.
Нужно чтобы они не потерялись.
Сейчас, без учета Country результаты импорта выглядят вот так:

ID Name 1 ABC

ID Name Company 1 Sales 1 2 Transportation 1

ID Name Position Department 1 Vasja Manager 1 2 Olga Secretutka 1 3 Petja Vodila 2 4 Victor Bombila 2

ID Name Company 1 Kolja 1 2 Borja 1 3 Misha 1

А хотелось бы, чтобы еще одна таблица была Country

Name Company Russia 1
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935812
_kpoIIIka eHoT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
_kpoIIIka eHoT
В сообщении 12410359 все подробно описано и замечательно работает, но как быть, если внутри родительского тэга <Records> </Records> появится еще один ребенок <Country> </Country>. Как в этом случае прописать связи sql:relationship между <Company> и <Country>
У вас же Country добавлен не как ребёнок Company, соответственно, откуда между ними могут быть связи?


Возможно я немного путаюсь в определении "Родители-дети", но структура файла именно такая. Совсем нет возможности связать <Company> и <Country> в этом случае ? Пример итоговых таблиц привел выше.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935816
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_kpoIIIka eHoT
alexeyvg
пропущено...
У вас же Country добавлен не как ребёнок Company, соответственно, откуда между ними могут быть связи?


Возможно я немного путаюсь в определении "Родители-дети", но структура файла именно такая. Совсем нет возможности связать <Company> и <Country> в этом случае ? Пример итоговых таблиц привел выше.
Связь <Company> и <Country> должна быть в XML файле.
Конечно, если этой связи нет, то у сервера, или, например, у вас, нет возможности придумать эту связь.

Правильная связь - это дочерняя нода <Country> в ноде <Company>, или атрибут.

Может сделать и неправильную связь (например, <Country> относится ко всем компаниям, описанным в XML-файле, или ещё как то), но не уверен, что SQLXMLBulkLoad-у можно про это сказать.
Придётся это программировать самостоятельно, без SQLXMLBulkLoad.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935829
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Правильная связь - это дочерняя нода <Country> в ноде <Company>, или атрибут.

Ровно моя ситуация, с которой бьюсь уже пару дней.
Идентификатора связи нет, но дочерний объект вложен в родительский.
Парсинг делается в SSIS XML Task, как сделать связь?
Мне нужно "протащить" идентификатор PPL_ID в дочерний элемент LINE (их может быть несколько)
Что-то туплю, но идей нет.

Код: 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.
<xs:element type="xs:integer" name="PPL_ID" maxOccurs="1" minOccurs="1">
	<xs:annotation>
		<xs:documentation>ID платежного документа </xs:documentation>
	</xs:annotation>
</xs:element>
...
<xs:element name="LIST_LINES" maxOccurs="1" minOccurs="1">
	<xs:complexType>
		<xs:sequence>
			<xs:element name="LINE" maxOccurs="unbounded" minOccurs="0">
				<xs:complexType>
					<xs:sequence>
						<xs:element type="xs:date" name="PPL_LINE_OPERTIONAL_DAY" maxOccurs="1" minOccurs="1">
							<xs:annotation>
								<xs:documentation>Дата проведения платежа </xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:string" name="PPL_LINE_DB_CR" maxOccurs="1" minOccurs="1">  
							<xs:annotation>
								<xs:documentation>Признак Дебет\Кредит проводки </xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:decimal" name="PPL_LINE_AMOUNT" maxOccurs="1" minOccurs="1">
							<xs:annotation>
								<xs:documentation>Сумма проводки</xs:documentation>
							</xs:annotation>

...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935900
iliych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обычно в таких сложных случаях вытаскивают данные с помощью искусственного интеллекта.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935913
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008
alexeyvg
Правильная связь - это дочерняя нода <Country> в ноде <Company>, или атрибут.

Ровно моя ситуация, с которой бьюсь уже пару дней.
Идентификатора связи нет, но дочерний объект вложен в родительский.
Парсинг делается в SSIS XML Task, как сделать связь?
Мне нужно "протащить" идентификатор PPL_ID в дочерний элемент LINE (их может быть несколько)
Что-то туплю, но идей нет.

Если ты не врешь и "дочерний объект вложен в родительский". По твоей схеме этого не скажешь.

У тебя все просто и незатейливо. При вложении - идентификатор скинуть во вложенные ноды - проще пареной репы.
Правда SSIS я не пользуюсь, голый sqlXmlBulkLoad.

Код: 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.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
           xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
>

  <xs:annotation>
   <xs:appinfo>

    <sql:relationship name="P"
          parent="[costa2_CostaPortCatalog]"
          parent-key="Market Channel"
          child="[costa2_Ports]"
          child-key="Market Channel" />

   </xs:appinfo>
  </xs:annotation>


<xs:attributeGroup name="MarketChannel">
            <xs:attribute name="Market" type="xs:string" use="required" sql:datatype="nvarchar(64)" />
            <xs:attribute name="Channel" type="xs:string" use="required" sql:datatype="nvarchar(64)" />
</xs:attributeGroup>

<xs:attributeGroup name="MarketChannelCurrency">
            <xs:attributeGroup ref="MarketChannel"/>
            <xs:attribute name="Currency" type="xs:string" sql:datatype="nvarchar(3)" />
            <xs:attribute name="Culture" type="xs:string" sql:datatype="nvarchar(64)" />
            <xs:attribute name="ExportAvailability" type="xs:boolean" sql:datatype="bit" />
            <xs:attribute name="Exported" type="xs:date" sql:datatype="date" />
</xs:attributeGroup>


  <xs:element name="CostaPortCatalog" 
                   sql:relation="[costa2_CostaPortCatalog]" 
                   sql:key-fields="Market Channel"
                   sql:overflow-field="OverflowColumn"
  >
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Ports" minOccurs="0" maxOccurs="1" sql:is-constant="1" >
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Port" minOccurs="0" maxOccurs="unbounded"
                   sql:relation="[costa2_Ports]" 
                   sql:key-fields="Market Channel Code"
                   sql:overflow-field="OverflowColumn"
                   sql:relationship="P"
              >
                <xs:complexType>

                  <xs:attributeGroup ref="MarketChannel"/>

                  <xs:attribute name="Code" type="xs:string" sql:datatype="nchar(3)" />
                  <xs:attribute name="Description" type="xs:string" sql:datatype="nvarchar(1024)" />
                  <xs:attribute name="AlternativeDescription" type="xs:string" sql:datatype="nvarchar(1024)" />
                  <xs:attribute name="ShortDescription" type="xs:string" sql:datatype="nvarchar(1024)" />
                  <xs:attribute name="LongDescription" type="xs:string" sql:datatype="nvarchar(4000)" />
                  <xs:attribute name="VeryLongDescription" type="xs:string" sql:datatype="nvarchar(max)" />
                  <xs:attribute name="ImageUrl" type="xs:string" sql:datatype="nvarchar(1024)" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>

      <xs:attributeGroup ref="MarketChannelCurrency"/>

    </xs:complexType>
  </xs:element>

  <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="CostaPortCatalog" />
      </xs:choice>
    </xs:complexType>
  </xs:element>

</xs:schema>

...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935924
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_kpoIIIka eHoT
alexeyvg
пропущено...
У вас же Country добавлен не как ребёнок Company, соответственно, откуда между ними могут быть связи?


Возможно я немного путаюсь в определении "Родители-дети", но структура файла именно такая. Совсем нет возможности связать <Company> и <Country> в этом случае ? Пример итоговых таблиц привел выше.


Увы, но альтернативно одаренные программизды - это казнь господня.
И этих казней гораздо больше, чем египетской саранчи.
Случай в точности соответствует анекдоту про "чукчу-писателя". Т.е. выгружающий данные не думает "как их будут загружать".

В общем случае, решается костылями "по месту". Степень гнутости костылей не ограничена.

В твоем случае:
1. Грузишь файл с Country и Company независимо, во ВСПОМОГАТЕЛЬНЫЕ пустые таблицы.
2. Копируешь из них в основные, назначив по дороге всем Company единственную Country.
3. Очищаешь ВСПОМОГАТЕЛЬНЫЕ таблицы и повторяешь с п.1
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935946
iliych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если ИИ по какоц-то причине вам не подъодит начните SCRUM-проект по вытаскиванию данных. Пригласите сертифицированных скрам-мастера CSM®, скрам продакт оунера CSPO®, скрам-разработчиков CSD®. Задача по моим подсчётам на 6 спринтов по неделе на спринт если все скрамеры сертифицированные. Через 1.5 месяца работы скрамеров данные будут вытаскиваваться откуда угодно куда угодно.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935979
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Правда SSIS я не пользуюсь, голый sqlXmlBulkLoad.

Нужно именно SSIS, пока другие варианты не рассматриваются.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039725
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с такой проблемой. В xml файле элементы в одинаковых блоках расположены в разном порядке. Причем ошибка возникает при проверке схемы, а при выполнении порядок не важен.
Как описать элементы, чтобы валидация проходила успешно?
Используется spXmlBulkLoad
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039826
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dik_68
Столкнулся с такой проблемой. В xml файле элементы в одинаковых блоках расположены в разном порядке. Причем ошибка возникает при проверке схемы, а при выполнении порядок не важен.
Как описать элементы, чтобы валидация проходила успешно?
Используется spXmlBulkLoad
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<root>
  <node>
    <a />
    <b />
    <c />
  </node>
  <node>
    <b />
    <a />
    <c />
  </node>
  <node>
    <c />
    <b />
    <a />
  </node>
</root>

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<xs:schema
  attributeFormDefault="unqualified"
  elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="node">
          <xs:complexType>
            <xs:sequence>
              <xs:choice maxOccurs="unbounded">
                <xs:element name="a" />
                <xs:element name="b" />
                <xs:element name="c" />
              </xs:choice>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


Да, имейте в виду, что по такой схеме вполне провалидируется вот такое:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<root>
  <node>
    <a />
    <a />
    <a />
  </node>
</root>
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039832
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, всё же лучше так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<xs:schema
  attributeFormDefault="unqualified"
  elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="node">
          <xs:complexType>
            <xs:all minOccurs="1">
              <xs:element name="a" />
              <xs:element name="b" />
              <xs:element name="c" />
            </xs:all>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039838
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dik_68
Столкнулся с такой проблемой. В xml файле элементы в одинаковых блоках расположены в разном порядке. Причем ошибка возникает при проверке схемы, а при выполнении порядок не важен.
Как описать элементы, чтобы валидация проходила успешно?
Используется spXmlBulkLoad


В комплекте Visual Studio есть утилита XSD.exe.
Скорми ей свой XML - получишь валидную схему... или отлуп.
Схему допилишь руками.

Ну и выкинь spXmlBulkLoad.
sqlXmlBulkLoad - наше фсе...
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039854
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
В комплекте Visual Studio есть утилита XSD.exe.

Ну вот он как раз и сгенерит схему с xs:choise maxOccurs="unbounded", которая не вполне корректна.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039947
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
aleks222
В комплекте Visual Studio есть утилита XSD.exe.

Ну вот он как раз и сгенерит схему с xs:choise maxOccurs="unbounded", которая не вполне корректна.

Наши руки не для скуки.

ЗЫ. А чего невалидного "xs:choise maxOccurs="unbounded""?
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039971
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
ЗЫ. А чего невалидного "xs:choise maxOccurs="unbounded""?

Валидно всё, только вот сама эта схема может отвалидировать, т.е. признать корректной, кривую структуру:

Сон Веры Павловны
Да, имейте в виду, что по такой схеме вполне провалидируется вот такое:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<root>
  <node>
    <a />
    <a />
    <a />
  </node>
</root>


- если человеку нужно, чтобы внутри node были в любой последовательности, но обязательно по 1 экземпляру ноды a, b, c, то такая валидация ему явно не подходит.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40040015
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за ответы.
Требования такие:
1. Наличие не обязательно
2. Порядок произвольный
3. Повторы не допускаются

зы Еще вопрос: Все данные находятся только в элементах и привязка к предыдущему уровню определяется только структурой. Есть возможность, чтобы ключи в SQL заполнялись процедурой, а не самим сервером? (Аналогично, как в openrowset были @mp:id и @mp:parentid)
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40040019
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222

Ну и выкинь spXmlBulkLoad.
sqlXmlBulkLoad - наше фсе...


Это типа шутка ?
В ней же sqlXmlBulkLoad и используется

Код: 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.
54.
55.
56.
alter PROCEDURE [dbo].[spXMLBulkLoad] (
	 @@File		SysName
	,@@Schema	SysName
	,@@DataBase	SysName	= '<DefaultDataBase>'
) AS BEGIN -- EXEC dbo.spXMLBulkLoad 'Z:\Path\Data.xml','Z:\Path\Schema.xsd'
	 --EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;
	DECLARE	 @ErrCode	Int
		,@OLEXMLBulk	Int
		,@ErrMethod	SysName
		,@ErrSource	SysName
		,@ErrDescript	NVarChar(4000)
	SET @ErrSource = 'E:\SQLXML\error.log'	--  файл ошибки (OPENROWSET требует константу)
	EXEC @ErrCode = sys.sp_OACreate 'SQLXMLBulkLoad.SQLXMLBulkload' ,@OLEXMLBulk OUT
	IF (@ErrCode = 0) BEGIN
		SET	@@DataBase	= 'Provider=SQLOLEDB;Data Source=.;DataBase=' + @@DataBase + ';Integrated Security=SSPI;CODEPAGE=1251;'
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'ConnectionString'	,@@DataBase		IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'ConnectionString'	GOTO Error END
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'ErrorLogFile'	,@ErrSource		IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'ErrorLogFile'	GOTO Error END
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'CheckConstraints'	,0			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'CheckConstraints'	GOTO Error END
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'KeepIdentity'	,0			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'Transaction'	GOTO Error END
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'Transaction'	,1			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'Transaction'	GOTO Error END
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'SchemaGen'	,0			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'SchemaGen'	GOTO Error END



		EXEC @ErrCode = sys.sp_OAMethod		@OLEXMLBulk ,'Execute', NULL	,@@Schema, @@File
		IF (@ErrCode != 0) BEGIN
			SET @ErrMethod = 'Execute'
			DECLARE	 @Exist	Int
				,@Error	XML
			EXEC	master.dbo.xp_FileExist	@ErrSource, @Exist OUT
			IF (@Exist = 1) BEGIN
				SELECT	 @Error		= E.Error
							-- Обход глюка
							+ CASE	WHEN Right(E.Error,1) != '>'	THEN 'lt>'
								ELSE ''				END
				FROM	OPENROWSET(BULK 'E:\SQLXML\error.log',SINGLE_NCLOB)E(Error) -- Из @ErrSource файла
				SELECT	@ErrDescript	= IsNull(@ErrDescript	,'') + E.Error.value('Description[1]','SysName') + ' '
				FROM	@Error.nodes('/Result/Error')E(Error)
				SELECT	@ErrDescript	= IsNull(@ErrDescript	,'') + E.Error.value('Description[1]','SysName') + ' '
				FROM	@Error.nodes('/Error/Record')E(Error)
			END ELSE
				GOTO Error
		END
		GOTO Destroy
	Error:	EXEC @ErrCode = sys.sp_OAGetErrorInfo	@OLEXMLBulk ,@ErrSource OUT ,@ErrDescript OUT
	Destroy:EXEC @ErrCode = sys.sp_OADestroy	@OLEXMLBulk
	END ELSE
		SELECT	 @ErrMethod	= 'SQLXMLBulkLoad.SQLXMLBulkload'
			,@ErrSource	= 'sp_OACreate'
			,@ErrDescript	= 'Ошибка создания OLE объекта'
	-- Вывод ошибок
	IF (@ErrMethod IS NOT NULL) BEGIN
		RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s',18,1,@ErrMethod,@ErrSource,@ErrDescript)
		RETURN	@@Error
	END
END


...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40040916
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще вопрос: Все данные находятся только в элементах и привязка к предыдущему уровню определяется только структурой. Есть возможность, чтобы ключи в SQL заполнялись процедурой, а не самим сервером? (Аналогично, как в openrowset были @mp:id и @mp:parentid)
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40040933
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dik_68
Есть возможность, чтобы ключи в SQL заполнялись процедурой, а не самим сервером?


Что такое "ключи"?
От квартиры, где деньги лежат?
sqlXmlBulkLoad не может занести в базу то, "чего нет в XML".
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40041060
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Что такое "ключи"?

Я про заполнение поля в дочерней таблице значением ключа из родительской.
При импорте через openrowset их тоже в xml нет, но процедура их заполняет фактически номерами строк.
Я надеялся, что и с sqlXmlBulkLoad есть что-то аналогичное.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40041118
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dik_68
aleks222
Что такое "ключи"?

Я про заполнение поля в дочерней таблице значением ключа из родительской.
При импорте через openrowset их тоже в xml нет, но процедура их заполняет фактически номерами строк.
Я надеялся, что и с sqlXmlBulkLoad есть что-то аналогичное.


Если в твоем ХМЛ есть "ключ" - заполнить можно. Изучай
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  <xs:annotation>
   <xs:appinfo>

    <sql:relationship name="R"
          parent="ParentTableName"
          parent-key="key"
          child="ChildTableName"
          child-key="key" 
    />

   </xs:appinfo>
  </xs:annotation>



Нет в твоем ХМЛ "ключа" - заполнить низзя.

ЗЫ. Да, правильные ХМЛ - редкость. Ибо "выгружатели" редко загружают свои творения.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40041332
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ.

Надеюсь, что последний вопрос.
Если для связи использую int: в родительской ([ID] [int] IDENTITY(1,1)) и дочерней ([PID] [int]), то импорт отрабатывает и поле PID заполняется, но если меняю на ([ID] [uniqueidentifier] NOT NULL DEFAULT (newid()) и ([PID] [uniqueidentifier]), то после импорта во всех записях PID=NULL
Видимо нужно где-то указать, что [PID] [uniqueidentifier], но не пойму где, т.к. в схеме оно упоминается только в блоке relationship

Код: 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.
<?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="itmp_EXP_itmp_ZL_LIST" parent="itmp_ZL_LIST" parent-key="ID" child="itmp_EXP" child-key="PID" />
  </xsd:appinfo>
 </xsd:annotation>
    <xsd:element name="ZL_LIST" sql:relation="itmp_ZL_LIST" sql:key-fields="ID">
     <xsd:complexType>
      <xsd:sequence>
       <xsd:element name="ZGLV" sql:is-constant="1">
        <xsd:complexType>
         <xsd:sequence>
             <xsd:element name="VERSION" sql:is-constant="1" />
             <xsd:element name="DATA" sql:is-constant="1" />
             <xsd:element name="FILENAME" sql:is-constant="1" />
         </xsd:sequence>
        </xsd:complexType>
       </xsd:element>
       <xsd:element maxOccurs="unbounded" name="EXP" sql:relation="itmp_EXP" sql:relationship="itmp_EXP_itmp_ZL_LIST" sql:key-fields="ID" >
        <xsd:complexType>
         <xsd:all minOccurs="1">
	  <xsd:element minOccurs="0" name="YEAR" type="xsd:unsignedShort" sql:datatype="varchar(1000)" />
	  <xsd:element minOccurs="0" name="MONTH" type="xsd:unsignedByte" sql:datatype="varchar(1000)" />
         </xsd:all>
        </xsd:complexType>
       </xsd:element>
      </xsd:sequence>
     </xsd:complexType>
    </xsd:element>
</xsd:schema>

...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40116075
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, есть такая XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="windows-1251"?>
<ROOT>
  <T1>
    <P1>3</P1>
	<T2>
		<P21>12</P21>
	</T2>
	<T2>
		<P21>122</P21>
	</T2>
  </T1>
  <T1>
    <P1>31</P1>
  </T1>
</ROOT>


и схема
Код: 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.
<?xml version="1.0" encoding="windows-1251"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
 <xsd:annotation>
  <xsd:appinfo>
   <sql:relationship name="FK_R_T1" parent="t_ROOT" parent-key="id" child="t_T1" child-key="pid" />
   <sql:relationship name="FK_T1_T2" parent="t_T1" parent-key="id" child="t_T2" child-key="pid" />
  </xsd:appinfo>
 </xsd:annotation>
	<xsd:element name="ROOT" sql:relation="t_ROOT" sql:key-field="id">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="T1" sql:relation="t_T1" sql:relationship="FK_R_T1" sql:key-field="id"  >
					<xsd:complexType>
						<xsd:sequence>
							<xsd:element name="P1" type="xsd:decimal" sql:datatype="decimal"/>
							<xsd:element name="T2" sql:relation="t_T2" sql:relationship="FK_T1_T2" sql:key-field="id"  >
								<xsd:complexType>
									<xsd:sequence>
										<xsd:element name="P21" type="xsd:decimal" sql:datatype="decimal"/>
									</xsd:sequence>
								</xsd:complexType>
							</xsd:element>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
</xsd:schema>


Получаю необходимый результат
t_ROOT
id N
8 NULL

t_T1
pid id P1
8 15 3
8 16 31

t_T2
pid id P21
15 7 12
15 8 122

Вопрос, как изменить схему, чтобы получить этот же результат, но с измененной XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?xml version="1.0" encoding="windows-1251"?>
<ROOT>
  <T1>
    <P1>3</P1>
	<T2>
		<P21>12</P21>
		<P21>122</P21>
	</T2>
  </T1>
  <T1>
    <P1>31</P1>
  </T1>
</ROOT>

...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40116260
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак. И так сойдет.

Лучше кляузу

sql:is-constant="1"

разучи.

<xsd:element name="ROOT" sql:is-constant="1">

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


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