OPENXML to .nodes(), вывод в формате XML

 
0
 
MS SQL Server
ava
lv151 | 25.03.2013, 12: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?
Comments (3)
ava
Zioma | 25.03.2013, 14:00 #
Если так

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


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

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


А вобще надо указывать, что вы хотите получить в результате.
ava
lv151 | 25.03.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>
ava
Zioma | 25.03.2013, 14:52 #
Возможно так:

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


А в вашем результате первая ветка повторяется 2 раза.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
ava  Zioma   lv151
advanced
Submit