6

为了首先给出这个问题的一些背景知识,我正在重写一些当前循环通过一些 xml 的代码,在每个循环结束时对表进行插入 - 替换为带有 xml 参数并在一个中插入的单个 sp去,将 xml '粉碎'到一个表中。

main shred 已成功完成,但目前其中一列用于存储整个节点。我已经能够(几乎)计算出必要的查询,但它错过了节点的根部分。我得出的结论是,我的查询已经尽我所能,我正在寻找一种方法来执行更新语句以将根节点放回那里。

所以我的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)

以 Wholenodecolumn 结尾的 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'  

并一起做我不知道这是否可能,但我尝试了各种语法并且无法开始工作。

任何其他解决问题的方法也很感激

4

3 回答 3

7

我相信您可以使用 FOR 子句指定根节点名称。

例如:

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

看看网上的书籍了解更多详情:

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

于 2009-03-08T21:29:51.040 回答
7

在这里回答我自己的问题!- 这是从评论到我所说的其他尝试答案之一:

我目前正在查询查询中的 FLWOR Xquery 构造。
col.query('for $item in * return <Item> {$item} </item>') 几乎就在那里,但围绕每个节点,而不是围绕所有节点

我的语法几乎就在那里,一个小的调整给了我我需要的东西;

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

感谢所有帮助过的人。我现在有更多相关问题,但我将作为单独的问题发布

于 2009-03-09T14:19:29.367 回答
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)

马克

于 2009-03-08T21:23:44.317 回答