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

Откуда:
Сообщений: 165
Здравствуйте,
Как можно выгрузить из этого хмл:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration-data>
    <attributeList>
		<attribute name="tpid" validationRuleName="String">
				<treenode name="Root">
					<treenode name="abcd">
						<treenode name="25" />
					</treenode>
					<treenode name="asdf">
						<treenode name="6" />
					</treenode>
				</treenode>
			</tree>
		</attribute>
	</attributeList>
</configuration-data>
данные в таблицу, чтобы получить такое:
DBName      ID
abcd        25
asdf         6
При этом xml файл лежит на сервере, т.е. нужно указать к нему путь и видимо как то присвоить переменной его содержимое, чтобы потом уже с работать с xml типом.

Понимаю что на форуме должна быть куча инфы по этому поводу, но мешают две вещи:
1. мои знания xml не позволяют мне понять КАК это сделать и ГДЕ искать на форуме
2. я не знаю как можно загрузить в переменную содержимое файла

Очень надеюсь на Вашу помощь

Спасибо.

P.S. Сервер MS SQL 2005
P.P.S. Пытался для решения первой проблемы использовать запрос похожий на:
DECLARE @XMLString xml

SET @XMLString ='
<Employee>
    <ContactInfo>
        <Info Name="Email">jacob.reliancesp[at]gmail.com</Info> 
        <Info Name="Phone">+919979882144</Info> 
        <Info Name="IM">jacob[at]excellenceinfonet.com</Info> 
    </ContactInfo>
</Employee>'

select  ref.value ('@Name', '[nvarchar](30)') as Name,
        ref.value ('.', '[nvarchar](30)') as info
from @XMLString.nodes('/Employee/ContactInfo/Info')
        as node(ref)
но не вышло...
25 окт 11, 19:55    [11498608]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Немного ошибся при описании xml файла. Должно быть на строчку больше:
<configuration-data>
    <attributeList>
		<attribute name="tpid" validationRuleName="String">
            <tree name="tpid_Hierarchy" description="Hierarchy">
				<treenode name="Root">
					<treenode name="abcd">
						<treenode name="25" />
					</treenode>
					<treenode name="MTTWebExpDE">
						<treenode name="6" />
					</treenode>
				</treenode>
			</tree>
		</attribute>
	</attributeList>
</configuration-data>
25 окт 11, 20:01    [11498630]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
whitebeast
но не вышло...
ПОнятное дело - у вас там тег </tree> закрывается, но не открывается.
25 окт 11, 20:02    [11498636]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
whitebeast
Немного ошибся при описании xml файла. Должно быть на строчку больше:
А, тогда так?
DECLARE @XMLString xml

SET @XMLString ='
<configuration-data>
    <attributeList>
		<attribute name="tpid" validationRuleName="String">
            <tree name="tpid_Hierarchy" description="Hierarchy">
				<treenode name="Root">
					<treenode name="abcd">
						<treenode name="25" />
					</treenode>
					<treenode name="MTTWebExpDE">
						<treenode name="6" />
					</treenode>
				</treenode>
			</tree>
		</attribute>
	</attributeList>
</configuration-data>
'

select  ref.value ('@name', '[nvarchar](30)') as Name,
		ref.value('treenode[1]/@name', '[nvarchar](30)') as info
from @XMLString.nodes('/configuration-data/attributeList/attribute/tree/treenode/treenode')
        as node(ref)
25 окт 11, 20:07    [11498649]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Огромное спасибо! К успеху шел оказывается :) Осталось понять как подгружать этот хмл из файла...
25 окт 11, 20:10    [11498656]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
whitebeast
Member

Откуда:
Сообщений: 165
хм... плюс если в хмл переменную добавить сначала строку:
<?xml version="1.0" encoding="UTF-8" ?>
которая есть в файле, из которого надо считать, то будет ошибка. Как то можно выбрать строку с которой начинать работать?
25 окт 11, 20:20    [11498708]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Думаю разобрался...
http://msdn.microsoft.com/ru-ru/library/ms191184.aspx
Делается через простой запрос вида:
INSERT INTO T(XmlCol)
SELECT * FROM OPENROWSET(
   BULK 'd:\1\1.xml',
   SINGLE_BLOB) AS x

Соответственно все гораздо проще.

Всем спасибо!
25 окт 11, 20:26    [11498728]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
whitebeast
Думаю разобрался...
Если файлы большие, то XmlBulkLoad вам не обойти, ибо быстрее не загрузишь ничем. Деревья грузит за раз. Никаких запросов. Нужен только XSD файл (это структура XML с пометкой соответствия колонкам таблиц).

8075805
25 окт 11, 21:19    [11498981]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Файлы не большие. Но столкнулся с одной проблемой.
Если хмл имеет такую структуру:
+
<configuration-data>
    <attributeList>
		<attribute name="tpid" validationRuleName="String">
            <tree name="tpid_Hierarchy" description="Hierarchy">
				<treenode name="Root">
					<treenode name="abcd">
						<treenode name="25" />
					</treenode>
					<treenode name="asdf">
						<treenode name="6" />
                                                <treenode name="7" />
                                                <treenode name="8" />
					</treenode>
				</treenode>
			</tree>
		</attribute>
	</attributeList>
</configuration-data>

То на выходе получаю:
DBName      ID
abcd        25
asdf         6

Вместо:
DBName      ID
abcd        25
asdf         6
asdf         7
asdf         8

Если не ошибаюсь надо через CROSS JOIN пробовать?

Подскажите плиз.
26 окт 11, 13:16    [11502239]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
_quark_
Member

Откуда:
Сообщений: 22
whitebeast
Если не ошибаюсь надо через CROSS JOIN пробовать?
Подскажите плиз.

Нет. Надо избавиться от
'treenode[1]/@name'
26 окт 11, 14:04    [11502787]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
whitebeast
Если не ошибаюсь надо через CROSS JOIN пробовать?
Какой ещё CROSS JOIN???

DECLARE @XMLString xml

SET @XMLString ='
<configuration-data>
    <attributeList>
		<attribute name="tpid" validationRuleName="String">
            <tree name="tpid_Hierarchy" description="Hierarchy">
				<treenode name="Root">
					<treenode name="abcd">
						<treenode name="25" />
					</treenode>
					<treenode name="asdf">
						<treenode name="6" />
                                                <treenode name="7" />
                                                <treenode name="8" />
					</treenode>
				</treenode>
			</tree>
		</attribute>
	</attributeList>
</configuration-data>
'

select  ref.value ('../@name', '[nvarchar](30)') as Name,
		ref.value('@name', '[nvarchar](30)') as info
from @XMLString.nodes('/configuration-data/attributeList/attribute/tree/treenode/treenode/treenode')
        as node(ref)
26 окт 11, 14:05    [11502795]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
iljy
Member

Откуда:
Сообщений: 8711
whitebeast,

declare @x xml = '
<configuration-data>
    <attributeList>
		<attribute name="tpid" validationRuleName="String">
            <tree name="tpid_Hierarchy" description="Hierarchy">
				<treenode name="Root">
					<treenode name="abcd">
						<treenode name="25" />
					</treenode>
					<treenode name="asdf">
						<treenode name="6" />
                        <treenode name="7" />
                        <treenode name="8" />
					</treenode>
				</treenode>
			</tree>
		</attribute>
	</attributeList>
</configuration-data>'

select  ref.value ('../@name', '[nvarchar](30)') as Name,
		ref.value('@name', '[nvarchar](30)') as info
from @x.nodes('/configuration-data/attributeList/attribute/tree/treenode/treenode/treenode')
        as node(ref)
        
        
select  ref.value ('@name', '[nvarchar](30)') as Name, t2.*
from @x.nodes('/configuration-data/attributeList/attribute/tree/treenode/treenode') node(ref)
	cross apply(       
		select  ref2.value('@name', '[nvarchar](30)') as info
		from ref.nodes('treenode') t(ref2)
	)t2
        

На практике 2й способ быстрее, в остальном разницы нет.
26 окт 11, 14:17    [11502909]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Спасибо огромное! Надо почитать более подробно про xml...

Еще раз спасибо :)
26 окт 11, 14:38    [11503087]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
-- Километры, но главное ПРОГРАММНОГО КОДА ... ошибка там, ошибка сям
Извращенцы.
Неадекват в том, что оцениваете то чего незнаете. (или завышаете значимость этой оценки)
Изучи XmlBulkLoad всё равно пригодится.
26 окт 11, 15:48    [11503862]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
iljy
Member

Откуда:
Сообщений: 8711
Mnior,

ну хочется человеку. А главное - изучить хмуль по любому не помешает.
26 окт 11, 16:02    [11503994]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Mnior,
1. этот таск нужно сделать без создания левых процедур
2. недопускается наличие левых файлов, пусть и необходимых
3. Изучу обязательно, но для данного таска - эта процедура лишняя.
26 окт 11, 18:26    [11505084]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
whitebeast
Mnior,
1. этот таск нужно сделать без создания левых процедур
2. недопускается наличие левых файлов, пусть и необходимых
3. Изучу обязательно, но для данного таска - эта процедура лишняя.
Всё мимо.
Вам не обязательно создвать отдельно объекты, можно тупо код вставить напрямую, и схему подавать не файлом а текстом.
Так что здесь я отмазался полнстью (почти естественно, но это уже сами выискивайте, а то меня достало "за других ходы прощитывать" для триллинга "спора")

Но, по настоящему ваши требования взяты с потолка лишь бы быть "правым/отмазаться".
Большинство (90%) втречаюшихся ответов в итоге сводятся к лень/@рать/"нет времени". (Или соглашайтесь с этим или пишите разыёрнутый ответ почему такие требования)
26 окт 11, 19:04    [11505284]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Тонкий троллинг однако...
Я не сомневаюсь в Вашей компетентности, но я не могу понять зачем столько агрессии? И видимо это уже в личке. Нефиг флудить
26 окт 11, 19:35    [11505396]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка данных из xml в таблицу  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
whitebeast
Тонкий троллинг однако...
Тролинг, это видимость аргументов при их отсутствии. К примеру аргумент "Нада".
А упоминания факта - "Аргументов нет"/"Это не аргумент" тролингом не назовёшь
whitebeast
столько агрессии?
Это вам показалось, это вы так воспринимаете слова - близко к серцу.
whitebeast
И видимо это уже в личке.
Нет, аргументы по поднятому топику нужны именно здесь. Иначе сам топик есть флуд на этом форуме. (Хотя их здесь и так большинство)

whitebeast, отвечая на вопрос топика ожидаешь (наивно) на встречный ответ на свой. Как и на вех других топиках меня интересует первопричина возникшей проблемы (и на оной мало кто задумывается).
27 окт 11, 09:52    [11506722]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить