首先介绍一下这个问题的背景知识,我正在重写一些当前循环遍历某些xml的代码,在每个循环结束时对表进行插入 - 替换为带有xml参数的单个sp并执行一次插入,将xml“粉碎”成表格。

主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语句看起来像;

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'  

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

还感激地接受了问题的任何其他方法

有帮助吗?

解决方案 2

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

  

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

我差不多用语法,一个小小的调整给了我所需要的东西;

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

谢谢所有帮助过的人。我现在还有其他相关问题,但我会将其作为单独的问题发布

其他提示

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

例如:

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

在线查看图书了解更多详情:

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

难道你不能在你的选择中添加''/'作为固定文本吗?类似的东西:

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)

马克

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top