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

Откуда:
Сообщений: 14
Всем привет!
В таблице есть колонка, в которой хранятся xml данные.
По с 3-м уровнем вложенности, и еще тройным внутри:
<users>
  <familys>
    <family>
		<?xml version="1.0" encoding="windows-1251"?>
		<childrens>
			<children>
				<bobby>
					Bobby cool
				</bobby>
				<carry>
					Carry strong
				</carry>
			</children>
		</childrens>
	</family>
  </familys>
</users>


Пытался получить содержимое тегов bobby и carry но выводит null, как правильно описать вложенность?

select * from family
where  childrens.value('(/users/familys/family/childrens/children/bobby)[1]', 'varchar(max)') like 'Bobby cool'
--или
where cast(childrens as xml).value('(/users/familys/family/childrens/children/bobby/node())[1]', 'varchar(max)') like 'Bobby cool'
6 фев 17, 17:58    [20185941]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
Владислав Колосов
Member

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

сначала извлеките <users> <familys> <family>, по нему пишите запрос на извлечение <childrens>.
У Вас в тэге <family> находится атомарный XML кусок.
6 фев 17, 18:16    [20186016]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
MSSQLuserK1
Member

Откуда:
Сообщений: 14
Владислав Колосов,

точно, что то не додумался, но и тут тоже не все гладко
select childrens.value(('(/users/familys/family[1]', 'varchar(max)') as mainSelect 

получит вложенную xml но я же не могу написать далее в
where mainSelect.values(.....)

Временную табличку тоже не хочу создавать.
6 фев 17, 18:53    [20186102]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
MSSQLuserK1
В таблице есть колонка, в которой хранятся xml данные.
В виде текста.
Потому что пока у вас декларация xml находится не в начале, невозможно преобразовать эти данные в xml и работать с ними далее.
6 фев 17, 19:15    [20186159]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
MSSQLuserK1
Member

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

К сожалению, не понял логически ваше утверждение
6 фев 17, 20:23    [20186353]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
MSSQLuserK1
К сожалению, не понял логически ваше утверждение
Сравните результат:
declare @x xml = '<users>
  <familys>
    <family>
		<childrens>
			<children>
				<bobby>
					Bobby cool
				</bobby>
				<carry>
					Carry strong
				</carry>
			</children>
		</childrens>
	</family>
  </familys>
</users>';

select
 t.n.value('bobby[1]', 'varchar(100)'),
 t.n.value('carry[1]', 'varchar(100)')
from
 @x.nodes('/users/familys/family/childrens/children') t(n);
go
и
declare @x xml = '<users>
  <familys>
    <family>
    <?xml version="1.0" encoding="windows-1251"?>
		<childrens>
			<children>
				<bobby>
					Bobby cool
				</bobby>
				<carry>
					Carry strong
				</carry>
			</children>
		</childrens>
	</family>
  </familys>
</users>';

select
 t.n.value('bobby[1]', 'varchar(100)'),
 t.n.value('carry[1]', 'varchar(100)')
from
 @x.nodes('/users/familys/family/childrens/children') t(n);
go
6 фев 17, 20:30    [20186401]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
MSSQLuserK1
Member

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

про кодировку понял, но Вы берете переменную xml и у нее nod-у из которой забираете текст, но эти данные в одном поле таблицы. И не получается построить запрос вида .... from table.node(....) так как в from нет такой конструкции.
т.е. нужно добавить надстройку над этим, для того чтобы вытянуть bobby
select childrens.value('(/users/familys/family)[1]', 'varchar(max)') as mainSelect from table 


пробовал так, но говорит что неправильный синтаксис:
select (childrens.value('(/users/familys/family)[1]', 'varchar(max)')).value('bobby', 'varchar(max)') from table
6 фев 17, 23:42    [20186899]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
MSSQLuserK1
И не получается построить запрос вида .... from table.node(....) так как в from нет такой конструкции.
Конечно нет. Вы же придумали собственный синтаксис.
Есть другая конструкция - https://msdn.microsoft.com/ru-ru/library/ms188282.aspx

declare @x xml = '<users>
  <familys>
    <family>
		<childrens>
			<children>
				<bobby>
					Bobby cool
				</bobby>
				<carry>
					Carry strong
				</carry>
			</children>
		</childrens>
	</family>
  </familys>
</users>';

declare @t table (id int identity, x xml);
insert into @t
values (@x), (@x);

select
 a.id,
 t.n.value('bobby[1]', 'varchar(100)'),
 t.n.value('carry[1]', 'varchar(100)')
from
 @t a cross apply
 a.x.nodes('/users/familys/family/childrens/children') t(n);
7 фев 17, 00:20    [20186977]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
MSSQLuserK1
Member

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

Запрос выполняется бесконечно, отличия которые увидел от Вашего варианта в следующем:
<users>
  <familys>
    <family>&lt;?xml version="1.0" encoding="windows-1251"?&gt;
	&lt;childrens&gt;
	&lt;children&gt;
	&lt;bobby&gt;
	Bobby cool
	&lt;/bobby&gt;
	&lt;carry&gt;
	Carry cool
	&lt;/carry&gt;
	&lt;/children&gt;
	&lt;/childrens&gt;
		</family>
	</familys>
</users>
7 фев 17, 11:15    [20187895]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
MSSQLuserK1
Member

Откуда:
Сообщений: 14
Т.е. ошибся внутренние теги идут не <> а alt;
Возможно из за кодировки не вытягивается, или из таких тегов нереально вытянуть.
7 фев 17, 11:19    [20187924]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
aleks2
Guest
MSSQLuserK1
Т.е. ошибся внутренние теги идут не <> а alt;
Возможно из за кодировки не вытягивается, или из таких тегов нереально вытянуть.

У вас значение узла family - экранированный XML.
Его можно достать "как обычную строку".
Снять экранировку и использовать далее по-назначению.
7 фев 17, 11:36    [20188016]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
MSSQLuserK1
invm,

Запрос выполняется бесконечно, отличия которые увидел от Вашего варианта в следующем:
<users>
  <familys>
    <family>&lt;?xml version="1.0" encoding="windows-1251"?&gt;
	&lt;childrens&gt;
	&lt;children&gt;
	&lt;bobby&gt;
	Bobby cool
	&lt;/bobby&gt;
	&lt;carry&gt;
	Carry cool
	&lt;/carry&gt;
	&lt;/children&gt;
	&lt;/childrens&gt;
		</family>
	</familys>
</users>
если хранится в таком виде, то можно сделать так:
declare @x xml = '<users>
  <familys>
    <family>&lt;?xml version="1.0" encoding="windows-1251"?&gt;
	&lt;childrens&gt;
	&lt;children&gt;
	&lt;bobby&gt;
	Bobby cool
	&lt;/bobby&gt;
	&lt;carry&gt;
	Carry cool
	&lt;/carry&gt;
	&lt;/children&gt;
	&lt;/childrens&gt;
		</family>
	</familys>
</users>'

select
	c.n.value('bobby[1]', 'varchar(max)'),
	c.n.value('carry[1]', 'varchar(max)')
from @x.nodes('/users/familys') a(n)
cross apply (values(cast(a.n.value('family[1]', 'varchar(max)') as xml))) b(n)
cross apply b.n.nodes('/childrens/children') c(n)
7 фев 17, 12:46    [20188385]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML  [new]
Владислав Колосов
Member

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

исходный текст - не XML, он только с виду похож.
7 фев 17, 13:09    [20188510]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить