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

Откуда:
Сообщений: 37
Здравствуйте!

никак не могу повенуть мозг в нужную сторону )

из xml типа
 <elements>
      <element id="1" name="xxx">
           <params>
                 <item cd="9893393" value="xxx1" />
                 <item cd="9893393" value="xxx2" />
           </params>
      </element>
      <element id="2" name="yyyy">
           <params>
                 <item cd="9893393" value="yyy1" />
                 <item cd="9893393" value="yyy2" />
           </params>
      </element>
 </elements>

нужно получить результат запроса вроде

element_id | element_name | param_cd | param_value
-----------------------------------------------------
1 | xxx | 9893393 | xxx1
................


Как правильно составить такое XPath запрос в MSSQL ?

что то вроде
select   
r.value('../@id', 'varchar(max)'), r.value('../@name', 'varchar(max)'), r.value('@cd', 'varchar(max)'), r.value('@value', 'varchar(max)'), 
from @good_xml.nodes('/elements/element/params/item') t(r)
20 сен 11, 15:41    [11306420]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать XPath запрос  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
И в чём проблема?
DECLARE	@XML	XML = '
<elements>
 <element id="1" name="xxx">
  <params>
   <item cd="9893393" value="xxx1" />
   <item cd="9893393" value="xxx2" />
  </params>
 </element>
 <element id="2" name="yyyy">
  <params>
   <item cd="9893393" value="yyy1" />
   <item cd="9893393" value="yyy2" />
  </params>
 </element>
</elements>'

SELECT	 X.value('../../@id'	,'Int')			AS element_id	-- За VarChar(max) можно и руки оторвать
	,X.value('../../@name'	,'VarChar(250)')	AS element_name
	,X.value('@cd'		,'BigInt')		AS param_cd
	,X.value('@value'	,'VarChar(2000)')	AS param_value
FROM	@XML.nodes('/elements/element/params/item') T(X)
element_idelement_nameparam_cdparam_value
1xxx9893393xxx1
1xxx9893393xxx2
2yyyy9893393yyy1
2yyyy9893393yyy2

Профтыкал?
20 сен 11, 16:32    [11307078]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать XPath запрос  [new]
AlexZgur
Member

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

Да да да ! Огромное спасибо )))
21 сен 11, 04:16    [11309277]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать XPath запрос  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
AlexZgur, да, но эффективее вот так:
DECLARE	@XML	XML = '
<elements>
 <element id="1" name="xxx">
  <params>
   <item cd="9893393" value="xxx1" />
   <item cd="9893393" value="xxx2" />
  </params>
 </element>
 <element id="2" name="yyyy">
  <params>
   <item cd="9893393" value="yyy1" />
   <item cd="9893393" value="yyy2" />
  </params>
 </element>
</elements>'

SELECT	 E.X.value('@id'	,'Int')			AS element_id
	,E.X.value('@name'	,'VarChar(250)')	AS element_name
	,P.X.value('@cd'	,'BigInt')		AS param_cd
	,P.X.value('@value'	,'VarChar(2000)')	AS param_value
FROM	           @XML.nodes('/elements/element')	E(X)
	CROSS APPLY E.X.nodes('params/item')		P(X)
21 сен 11, 10:34    [11309892]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать XPath запрос  [new]
AlexZgur
Member

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

Да действительно - протестил этот вариант. Он и по стоимости достаточно оптимален. К сожалению оператор APPLY мало употребим (лично мной и моими коллегами по крайней мере) поэтому сразу про него и не вспомнил (

Надеюсь теперь отложиться ! Еще раз спасибо!!!
21 сен 11, 12:15    [11310723]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать XPath запрос  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
AlexZgur
К сожалению оператор APPLY мало употребим (лично мной и моими коллегами по крайней мере) поэтому сразу про него и не вспомнил (
Лучше потреблять APPLY где не попадя, чем потреблять XML на скуле. Во всяком случае 10 раз подумать.

Use: XMLBulkInsert, SQLXMLOLEDB Provider (SQLXML 4.0), Table-Valued parameters
21 сен 11, 16:29    [11313530]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить