Прежде всего, чтобы переустановить эту проблему, я переписываю код, который в настоящее время проходит через некоторый 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'
и делаю оба вместе, я не знаю, возможно ли это, но я пробовал различный синтаксис и не могу работать.
Любые другие подходы к проблеме также благодарностью
Нет сожаления, что это не сработает. Я думаю, что вы имеете в виду также «- » + doc.col.query ('*') + '
- код, который вы здесь указываете, выбирает - и
как отдельные столбцы, тогда как мне нужно, чтобы они были частью xml Я получаю результат doc.col.query ('*'). –
DannykPowell
Кроме того, для этого вам нужно будет преобразовать xml в varchar. – DannykPowell
Далее - попытались преобразовать xml в varchar (max), но получить конфликты сортировки - я думаю, из-за некоторых символов в xml (также попробовал nvarchar) – DannykPowell