Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
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 Position
ABC Sales Olga Secretutka
ABC Sales Vasja Manager
ABC Transportation Petja Vodila
ABC Transportation Victor Bombila


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

Кто-то делал такое?
5 апр 12, 23:56    [12373603]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31994
SandalTree
Не хочу изобретать велосипед.
От версии зависит.
6 апр 12, 00:10    [12373641]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
alexeyvg
SandalTree
Не хочу изобретать велосипед.
От версии зависит.
2008R2
6 апр 12, 00:13    [12373647]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Alexander Karavaev
Member

Откуда: Москва
Сообщений: 40
SandalTree, может быть пройтись по схеме и сформировать селект вида
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)
?
6 апр 12, 00:52    [12373730]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6204
SandalTree
У меня в схеме более 30К строк, до 6 уровней вложения, а количество полей порядка 1600.

Так что в итоге нужно? 6 уровней вложения? - это company внутри company? department внутри department? person внутри person?) Или нужно просто вытащить содержимое нод person, и для них - значения company и department от parent (ancestor) нод?
Остальные 1600-4 = 1596 полей к какому типу нод (company/department/person) относятся?
В общем, опишите задачу точнее.
Если просто персоны, и для них - компания/отдел, в которых они состоят (без упомянутых выше вложений) - то как-то так:
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)
6 апр 12, 03:57    [12373872]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Сон Веры Павловны
SandalTree
У меня в схеме более 30К строк, до 6 уровней вложения, а количество полей порядка 1600.

Так что в итоге нужно? 6 уровней вложения? - это company внутри company? department внутри department? person внутри person?) Или нужно просто вытащить содержимое нод person, и для них - значения company и department от parent (ancestor) нод?
Остальные 1600-4 = 1596 полей к какому типу нод (company/department/person) относятся?
В общем, опишите задачу точнее.
Если просто персоны, и для них - компания/отдел, в которых они состоят (без упомянутых выше вложений) - то как-то так:
Мой кусок кода это просто пример для извращений.

На самом деле всё гооораздо сложнее. Уровни вложения могут различаться в различных нодах и всё может повторяться или нет.
Запостил-бы сюда xsd, но он больше 30000 строк.
6 апр 12, 05:40    [12373886]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6204
SandalTree
Мой кусок кода это просто пример для извращений.
На самом деле всё гооораздо сложнее. Уровни вложения могут различаться в различных нодах и всё может повторяться или нет.
Запостил-бы сюда xsd, но он больше 30000 строк.

Я тогда бы всё-таки применил к вашему XML XSLT. Для именно приведенного в стартовом постинге - что-то типа
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />
  <xsl:template match="/">
    <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>

и тогда на выходе получится такой нодесет:
<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 будет выглядеть как-то иначе.
6 апр 12, 06:48    [12373905]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Marugr
Guest
старый способ, можно еще используя xPath но замороченей
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
6 апр 12, 07:02    [12373911]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SandalTree
У меня в схеме более 30К ...
XmlBulkLoad адназначна.
6 апр 12, 12:07    [12375036]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Сон Веры Павловны

[/src]
и тогда на выходе получится такой нодесет:
<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 будет выглядеть как-то иначе.
То что я привёл в виде примера, это не сама задача, а просто что-то маленькое, очень похожее на большое. Я не могу менять схему, она ко мне приходит готовая, а я уже должен её принять.
6 апр 12, 16:00    [12377282]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Marugr
старый способ, можно еще используя xPath но замороченей
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
Спасибо, очень красиво, но у меня проблема в том что одни и те-же названия могут применяться на одном и том-же уровне вложености:
<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а.
Я видел в инете подобные примеры, но так не понимаю как он работает.
Но если дело что мне надо, то тогда на нём и остановлюсь.
6 апр 12, 16:09    [12377339]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Не реагирует. Повторяю.
EXEC dbo.spXmlBulkLoad 'Z:\Path\Data.xml', 'Z:\Path\Schema.xsd'
Одна команда и все данные записаны во все таблицы зразу.

8075805
6 апр 12, 18:53    [12378227]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Mnior
Не реагирует. Повторяю.
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


Как я понял, стандартные решения не катят, ибо даже после того как я успешно распарсил файл, он у меня вылил все данные в одну строку. И этого можно было ожидать, так как мне пришлось все поля сделать уникальными, иначе повторы имён выдавали ошибку. А так как уровни вложености и ноды у одинаковых имён различны, то сгруппировать по сторокам не представляется никакой возможности.
Наверное можно что-то ручками сделать, но я-бы не старался.
10 апр 12, 22:59    [12396554]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SandalTree
Msg 15281, Level 16, State 1, Procedure sp_OACreate, Line 1
Ага, а в первой же строке в процедуре английским по белому:
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;
Специально для лентяев.

SandalTree
Как я понял, стандартные решения не катят
Катят.
SandalTree
он у меня вылил все данные в одну строку.
Неправильно отструктуировали.
SandalTree
мне пришлось все поля сделать уникальными, иначе повторы имён выдавали ошибку
С какого перепугу.
SandalTree
А так как уровни вложености и ноды у одинаковых имён различны, то сгруппировать по сторокам не представляется никакой возможности.
Ну тогда оторвите руки тому кто делал формат данного малополезного документа.
Чёта я по формату документа не вижу совершенно никаких дублей. Или там на полставки работают в разных департаментах? Ну дык укажите тока основной.
11 апр 12, 12:10    [12398244]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Mnior
Чёта я по формату документа не вижу совершенно никаких дублей. Или там на полставки работают в разных департаментах? Ну дык укажите тока основной.

Вот. Нарисуй мне результат запроса из этого ХМЛа.
<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>
11 апр 12, 16:12    [12400579]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SandalTree
Вот. Нарисуй мне результат запроса из этого ХМЛа.
Какого навиг запроса?
Запускаю:
EXEC dbo.spXmlBulkLoad 'Z:\Path\Data.xml', 'Z:\Path\Schema.xsd'

В результате в 3х таблицах появились записи:
dbo.Company:
Name
ABC
dbo.Department:
CompanyName
ABCSales
ABCTransportation
dbo.Person:
DepartmentNamePosition
SalesVasjaManager
SalesOlgaSecretutka
TransportationPetjaVodila
TransportationVictorBombila


Ну в зависимости как вы расписали схему таблиц и XSD. Например вместо имён подставились автоинкрементные поля.
11 апр 12, 19:18    [12401725]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Mnior
SandalTree
Вот. Нарисуй мне результат запроса из этого ХМЛа.
Какого навиг запроса?
Запускаю:
EXEC dbo.spXmlBulkLoad 'Z:\Path\Data.xml', 'Z:\Path\Schema.xsd'

В результате в 3х таблицах появились записи:
dbo.Company:
Name
ABC
dbo.Department:
CompanyName
ABCSales
ABCTransportation
dbo.Person:
DepartmentNamePosition
SalesVasjaManager
SalesOlgaSecretutka
TransportationPetjaVodila
TransportationVictorBombila


Ну в зависимости как вы расписали схему таблиц и XSD. Например вместо имён подставились автоинкрементные поля.
Забыл про четвёртую - "основатели"...
Но в том-то и фикус что в таком маленьком хмльчике уместились данные аж для четверых таблиц.
А представь если там 1600 позиций... Брошу я это дело как неподъёмное. Нефиг на мне ездить.
Пущай в джаве парсють, а мне только чистые данные кидают.
12 апр 12, 07:09    [12403285]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SandalTree
А представь если там 1600 позиций... Брошу я это дело как неподъёмное.
Слабак:

Ищем в гугле "xsd generator online".
Находим это
Подставлям свой XML
+
+ Получаем XSD
<?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) подставляем связки с таблами по уже имеющейся у вас схеме БД.
+
+ Имеем схему таблиц
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 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>
Далее запускаем:
EXEC SomeDB.dbo.spXmlBulkLoad 'Z:\Path\Test.xml', 'Z:\Path\Test.xsd', 'tempdb', 0
+
+ Результат
SELECT * FROM dbo.Company
SELECT * FROM dbo.Department
SELECT * FROM dbo.Person
SELECT * FROM dbo.Founder
IDName
1ABC

IDNameCompany
1Sales1
2Transportation1

IDNamePositionDepartment
1VasjaManager1
2OlgaSecretutka1
3PetjaVodila2
4VictorBombila2

IDNameCompany
1Kolja1
2Borja1
3Misha1
+
+ Замечания
В указанной на форуме процедуре отсутствует необходимая для данного случая (подстановка Identity) строка:
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'KeepIdentity'	,0			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'KeepIdentity'	GOTO Error END
В моём случае задаётся 4-м параметром (по умолчанию 1)


Сообщение было отредактировано: 13 апр 12, 15:34
13 апр 12, 11:04    [12410359]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
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.


А, вообще, снимаю шляпу перед твоей настойчивостью.
13 апр 12, 16:31    [12413320]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
SandalTree, сейчас придет Mnior, скажет вам какую-нить гадость и будет прав.
13 апр 12, 17:02    [12413491]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SandalTree
В моём примере бизнес логика самая наипростейшая, вытянуть данные ничего не стоит.
Вообщето я понял. Возможно вы и правы (тады не понятно зачем вообще вы поднимали топик; но критичекое отношение к задаче - бальзам на душу), только не очень понятна ситуация в целом (мысли ваши не читаем) противоречива:
- нужно данные вытянуть
- структура неизвесна и предположительно заранее отсутствует
Это как ? Куда данные выковыривать, и зачем?!

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

SandalTree
И кстати, процедуру твою я игнорировал, севрер ругается на вот эти системки:
sys.sp_OACreate
sys.sp_OASetProperty
Слоупок?: 12398244
Mnior
Ага, а в первой же строке в процедуре английским по белому:
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;
Специально для лентяев.
13 апр 12, 19:01    [12414061]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Mnior
SandalTree
В моём примере бизнес логика самая наипростейшая, вытянуть данные ничего не стоит.
Вообщето я понял. Возможно вы и правы (тады не понятно зачем вообще вы поднимали топик; но критичекое отношение к задаче - бальзам на душу), только не очень понятна ситуация в целом (мысли ваши не читаем) противоречива:
- нужно данные вытянуть
- структура неизвесна и предположительно заранее отсутствует
Это как ? Куда данные выковыривать, и зачем?!
XSD есть, но он настолько велик что человеку "с улицы" не обьять необьятное. Вот хай-левел описаловка: http://support.ezclaim.com/ANSIRef/

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

Mnior
SandalTree
И кстати, процедуру твою я игнорировал, севрер ругается на вот эти системки:
sys.sp_OACreate
sys.sp_OASetProperty
Слоупок?: 12398244
Mnior
Ага, а в первой же строке в процедуре английским по белому:
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;
Специально для лентяев.
Ну так я это понимаю, но у меня нет власти над серваком.
13 апр 12, 19:51    [12414317]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SandalTree
Вот хай-левел описаловка: http://support.ezclaim.com/ANSIRef/
Это не описалово это муть, так, для вида. Уже подозрительно, но я взглянул поверхностно.
SandalTree
нужно делать маппинг, а я не знаю бизнес логики ни источника ни приёмника.
Так в этом и стоит задача. Только в этом!
И вам нужно выбрать стратегию - через какой механизм и как это делать.
Задача предельно чёткая и понятная, конкретная и частная.

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

Mnior
у меня нет власти над серваком.
У меня тоже нет, прямой, и шо?! Есть требования, притом обоснованные.
Или вы росли в глуши и люди у вас вызывают панический страх?
13 апр 12, 22:53    [12415294]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Mnior
SandalTree
Вот хай-левел описаловка: http://support.ezclaim.com/ANSIRef/
Это не описалово это муть, так, для вида. Уже подозрительно, но я взглянул поверхностно.

О! А мне это попытались всунуть вместо спецификации.

Mnior
У меня тоже нет, прямой, и шо?! Есть требования, притом обоснованные.
Или вы росли в глуши и люди у вас вызывают панический страх?
Ты местную бюрократию не знаешь. Я что крайний что-ли по инстанциям ходить. Инициатива очень строго наказуема. (по крайней мере, пока проект не горит)
16 апр 12, 15:57    [12423285]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить данные из сложной и многоуровневой XML?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SandalTree
Ты местную бюрократию не знаешь. Я что крайний что-ли по инстанциям ходить. Инициатива очень строго наказуема. (по крайней мере, пока проект не горит)
Я знаю очень хорошо то что люди очень много болтают подобным образом и при этом ничего, никогда не пробовали сделать.
Но самое прискорбное, что когда в очередной 100500 раз явно показываешь, что все нормально можно "пробить" за 2 секунды, то до мозгов это не доходит. Это диагноз, а не бюрократия.
Да есть случаи, но "обход" очень часто находится.

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

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

PS: Если бюрократия реально непробиваема (редкий случай). Найдите себе достойную работу. Можете с шефом это осудить. Не холопы же вы. Или нет?
16 апр 12, 23:32    [12424771]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить