2009-03-08 6 views
4

Прежде всего, чтобы переустановить эту проблему, я переписываю код, который в настоящее время проходит через некоторый xml, делая вставку в таблицу в конце каждого цикла - заменяя single sp, который принимает параметр xml и делает вставку за один раз, «измельчение» xml в таблицу.Измените XML на SQL-сервере, чтобы добавить корневой узел

Главное измельчение сделано успешно, но в настоящее время один из столбцов используется для хранения всего узла. Я смог выработать необходимый для этого запрос (почти), но он пропустил корневую часть узла. Я пришел к выводу, что мой запрос так же хорош, как я могу его получить, и я ищу способ сделать заявление о обновлении, чтобы вернуть корневой узел туда.

Так что мой xml имеет форму;

<xml> 
<Items> 
<Item> 
    <node1>...</node1><node2>..<node2>.....<noden>...<noden> 
<Item> 
<Item> 
    <node1>...</node1><node2>..<node2>.....<noden>...<noden> 
<Item> 
<Item> 
    <node1>...</node1><node2>..<node2>.....<noden>...<noden> 
<Item> 
...... 
<Items> 
</xml> 

Таким образом, основное Измельчение помещает значение из node1 в column1, node2 в column2 и т.д. Оператор вставки выглядит как;

INSERT INTO mytable col1, col2,...etc.....,wholenodecolumn 
Select 
doc.col.value('node1[1]', 'int') column1, 
doc.col.value('node2[1]', 'varchar(50)') column2, 
....etc......, 
doc.col.query('*')--this is the query for getting the whole node 
FROM @xml.nodes('//Items/Item') doc(col) 

XML, который попадает в целую коллекцию, имеет форму;

<node1>...</node1><node2>..<node2>.....<noden>...<noden> 

, но мне нужно, чтобы быть в форме

<Item><node1>...</node1><node2>..<node2>.....<noden>...<noden></Item> 

Существует существующий код (много его), что зависит от XML в этой колонке существа правильной формы.

Возможно, кто-то может посмотреть, как изменить doc.col.query('*'), чтобы получить желаемый результат?

В любом случае, я отказался от изменения запроса и попытался придумать другие способы достижения конечного результата. То, что я сейчас рассматриваю, - это обновление после вставки - что-то вроде;

update mytable set wholenodecolumn.modify('insert <Item> as first before * ') 

Если бы я мог сделать это вместе с

.modify('insert </Item> as last after * ') 

, что было бы хорошо, но делать 1 в то время, это не вариант, поскольку XML является то недействительна

XQuery [mytable.wholenodecolumn.modify()]: Expected end tag 'Item' 

и делаю оба вместе, я не знаю, возможно ли это, но я пробовал различный синтаксис и не могу работать.

Любые другие подходы к проблеме также благодарностью

ответ

5

Отвечая на мой собственный вопрос здесь! - это вытекает из комментариев к одной из других попыток ответов, где я сказал:

Я в настоящее время изучает FLWOR XQUERY строит в запросе.
col.query('for $item in * return <Item> {$item} </item>') почти , но ставит вокруг каждого узла, а не вокруг всех узлов

я был почти там с синтаксисом, небольшой твик дал мне то, что мне было нужно;

doc.col.query('<Item> { for $item in * return $item } </item>' 

Благодарим всех, кто помог. У меня есть дополнительные вопросы сейчас, но я буду размещать как отдельные вопросы.

0

не могли бы вы просто добавить «»/«» в качестве основных текстов в ваш выбор? Что-то вроде:

Select 
    '<Item>', 
    doc.col.value('node1[1]', 'int') column1, 
    doc.col.value('node2[1]', 'varchar(50)') column2, 
    ....etc......, 
    doc.col.query('*'), 
    '</Item>'  --this is the query for getting the whole node 
FROM @xml.nodes('//Items/Item') doc(col) 

Марк

+0

Нет сожаления, что это не сработает. Я думаю, что вы имеете в виду также «» + doc.col.query ('*') + ' - код, который вы здесь указываете, выбирает и как отдельные столбцы, тогда как мне нужно, чтобы они были частью xml Я получаю результат doc.col.query ('*'). – DannykPowell

+0

Кроме того, для этого вам нужно будет преобразовать xml в varchar. – DannykPowell

+0

Далее - попытались преобразовать xml в varchar (max), но получить конфликты сортировки - я думаю, из-за некоторых символов в xml (также попробовал nvarchar) – DannykPowell

8

Я считаю, позволяющее задать имя корневого узла, используя для пункта.

Например:

select top 1 * 
from HumanResources.Department 
for XML AUTO, ROOT('RootNodeName') 

Потратьте смотрит на книги онлайн для более подробной информации:

http://msdn.microsoft.com/en-us/library/ms190922.aspx

+0

Я экспериментировал с этим, но не вижу, как он будет работать с моим запросом. Можете ли вы привести пример того, как это будет использоваться; Выберите ..... doc.col.query ('*') FROM @ xml.nodes ('// Items/Item') doc (col) введите запрос? – DannykPowell

+0

Предложение FOR XML не допускается в инструкции INSERT. – DannykPowell

Смежные вопросы