Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > OPENXML to .nodes(), вывод в формате XML


Автор: lv151 25.3.2013, 11:52
Код

DECLARE @XML_Ptr INT
DECLARE @InXML XML = '<recipe>  
  <composition>
    <ingredient amount="3" unit="стакан">Мука</ingredient>
    <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>
    <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient>
    <ingredient amount="1" unit="чайная ложка">Соль</ingredient>
  </composition>
  <composition>
    <ingredient amount="1" unit="стакан1">Мука</ingredient>
    <ingredient amount="2" unit="грамм2">Дрожжи</ingredient>
    <ingredient amount="3" unit="стакан3">Тёплая вода</ingredient>
    <ingredient amount="4" unit="чайная ложка4">Соль</ingredient>
  </composition>
  </recipe>'
  
EXEC sp_xml_preparedocument @XML_Ptr OUTPUT, @InXML

SELECT recipe.rec
   FROM OPENXML (@XML_Ptr, '/recipe/composition', 2)
   WITH (         
          rec XML     '../composition'
        ) recipe


Код


Пытаюсь переделать на nodes:
 SELECT T.c.value('../composition[1]', 'xml' ) AS rec        
 FROM @InXML.nodes('/recipe/composition') T(c)


The data type 'xml' used in the VALUE method is invalid.

Возможно ли как-то по-другому вывести данные в формате xml?

Автор: Zioma 25.3.2013, 14:00
Если так
Код

SELECT
    T.c.value('../composition[1]', 'nvarchar(max)' ) AS rec        
FROM @InXML.nodes('/recipe/composition') T(c)


то результат такой
Код

МукаДрожжиТёплая водаСоль
МукаДрожжиТёплая водаСоль


А вобще надо указывать, что вы хотите получить в результате.

Автор: lv151 25.3.2013, 14:16
Код

SELECT recipe.rec
   FROM OPENXML (@XML_Ptr, '/recipe/composition', 2)
   WITH (         
          rec XML     '../composition'
        ) recipe


Результат:
Код

<composition><ingredient amount="3" unit="стакан">Мука</ingredient><ingredient amount="0.25" unit="грамм">Дрожжи</ingredient><ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient><ingredient amount="1" unit="чайная ложка">Соль</ingredient></composition>
<composition><ingredient amount="3" unit="стакан">Мука</ingredient><ingredient amount="0.25" unit="грамм">Дрожжи</ingredient><ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient><ingredient amount="1" unit="чайная ложка">Соль</ingredient></composition>


Код

SELECT
    T.c.value('../composition[1]', 'nvarchar(max)' ) AS rec        
FROM @InXML.nodes('/recipe/composition') T(c)


Результат:
МукаДрожжиТёплая водаСоль
МукаДрожжиТёплая водаСоль


Возможно ли чтобы при работе с nodes результат был такой:
Код

<composition><ingredient amount="3" unit="стакан">Мука</ingredient><ingredient amount="0.25" unit="грамм">Дрожжи</ingredient><ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient><ingredient amount="1" unit="чайная ложка">Соль</ingredient></composition>
<composition><ingredient amount="3" unit="стакан">Мука</ingredient><ingredient amount="0.25" unit="грамм">Дрожжи</ingredient><ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient><ingredient amount="1" unit="чайная ложка">Соль</ingredient></composition>

Автор: Zioma 25.3.2013, 14:52
Возможно так:
Код

select 
    c.query('.')
FROM
    @InXML.nodes('/recipe/composition') T(c)


А в вашем результате первая ветка повторяется 2 раза.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)