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

Откуда: Россия, Казань
Сообщений: 20899
Чувствую что вопрос чуть ли не из FAQ, но поиск какую-то фигню выдает.

поле-xml содержит команду
<info name="Client">
<param name="Number" value="000023" />
<param name="test" value="test" />
</info>

как селектом получить значение узлов Number и test?
15 окт 10, 12:25    [9613178]     Ответить | Цитировать Сообщить модератору
 Re: Как получить ноду из xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
nodes()
value()
15 окт 10, 14:17    [9614297]     Ответить | Цитировать Сообщить модератору
 Re: Как получить ноду из xml  [new]
мимо
Guest
declare @xml as xml = ' <info name="Client">
<param name="Number" value="000023" />
<param name="test" value="test" />
</info>
'
select  y.r.value('@name','varchar(10)')
		,y.r.value('@value','varchar(10)')
from @xml.nodes('info/param') as y(r)
15 окт 10, 14:32    [9614468]     Ответить | Цитировать Сообщить модератору
 Re: Как получить ноду из xml  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
всем спасибо. Получилось.

но вот теперь встала задача создать xml по данным и пульнуть обратно

вот такой кодик(всецело открыт для критики:)
declare @xml xml, @xml2 xml
begin
SELECT @xml=XmlItem FROM TEntities WITH (NOLOCK)

	declare @fields table
	(
	   Field varchar(255)
	)
	
	insert into @fields
	select y.r.value('@name','varchar(255)')as Field 
		   --,y.r.value('@type','varchar(255)')
	from @xml.nodes('table/fields/field') as y(r)
	
select f.Field from @fields f
WHERE f.Field NOT IN(
	SELECT e.Field FROM TFields d WITH (NOLOCK) 
	left join @fields e on d.Field = e.Field
)

end

вот получаю я в последнем селекте список полей, теперь как мне подготовить xml для отправки вида
<tablename="Users">
<fields>
<field name="UserID" />
...
</fields>
</tablename>
24 ноя 10, 11:53    [9830452]     Ответить | Цитировать Сообщить модератору
 Re: Как получить ноду из xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
А какова основная задача. Обновить значения в xml, или xml до и после совсем никак не коррелирует?
24 ноя 10, 18:48    [9834329]     Ответить | Цитировать Сообщить модератору
 Re: Как получить ноду из xml  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Mnior,

Вопрос Вам как знатоку XML. Как бы даже и не совсем оффтоп. Чем XQuery лучше/хуже OPENXML? Я сейчас пользуюсь последним, от того и интерес.
24 ноя 10, 18:56    [9834372]     Ответить | Цитировать Сообщить модератору
 Re: Как получить ноду из xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Senya_L
Чем XQuery лучше/хуже OPENXML? Я сейчас пользуюсь последним, от того и интерес.

1. Оффтоп. Правилами форума запрещено задавать вопрос в чужой теме.
2. Неоднократно писалось на форуме.
3. Много мелких нюансов. Всех не припомнишь. См. пункт 2.
4. Если по скорости (имеет смысл только на больших объёмах), по море ухудшения скорости:
1. XmlBulkLoad (намного впереди, SAX)
2. OpenXml (DOM)
3. XQuery (DOM)
5. OpenXml - императивный (в запросах не попользуешься) и деприкатный (в последующих версиях не поддерживается), узко-специализированный функционал (поэтому и чуть быстрее XQuery)
6. Если есть возможность, то лучше избавиться от XML вообще. Например, в 2008м есть табличный входные параметры к процедурам; SQL провайдер умеет генерировать и парсить XML на стороне клиента довольно прозрачно - что помогает отгородиться от общемировой эпидемической болезни, как xml-изация головного мозга. ;)
26 ноя 10, 20:00    [9847826]     Ответить | Цитировать Сообщить модератору
 Re: Как получить ноду из xml  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
подними тему, дабы вопрос из той же когорты. Смотрите

DECLARE @x xml ;
SET 
@x=
' <param name="user" value="OracleLover" />
  <param name="pass" value="#test" />
'
select * from 
(
SELECT c.value('./@name', 'varchar(50)') AS name, c.value('./@value','varchar(50)') as value
FROM   @x.nodes('/param') T(c)
) t
where t.name = 'user'

можно ли этот запрос упростить, хотя бы обойтись без подселекта? Естественно можно обратиться по индексу значения, но это как вы понимаете неспортивно.
31 май 11, 17:37    [10740800]     Ответить | Цитировать Сообщить модератору
 Re: Как получить ноду из xml  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Как вариант:
SELECT T.c.value('./@name', 'varchar(50)') AS name, T.c.value('./@value','varchar(50)') as value
FROM   @x.nodes('/param[@name="user"]') T(c);
31 май 11, 18:34    [10741055]     Ответить | Цитировать Сообщить модератору
 Re: Как получить ноду из xml  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
На всякий:
DECLARE	@x XML ='
<param name="user" value="OracleLover"/>
<param name="pass" value="#test"/>'

SELECT	*
FROM	@x.nodes('/param') P(X) CROSS APPLY (SELECT
	 P.X.value('@name' ,'VarChar(50)')
	,P.X.value('@value','VarChar(50)')
	) C(name,value)
WHERE	C.name = 'user'
31 май 11, 21:16    [10741618]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить