为了首先给出这个问题的一些背景知识,我正在重写一些当前循环遍历某些xml的代码,在每个循环结束时对一个表进行插入 - 用一个带有xml参数的sp替换并在一个中插入一个go,'将xml'粉碎成表.
主Shred已成功完成,但目前其中一列用于存储整个节点.我已经能够计算出这个(几乎)所需的查询,但它错过了节点的根部分.我得出的结论是,我的查询和我能得到的一样好,而且我正在寻找一种方法然后执行更新语句以将根节点恢复到那里.
所以我的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)
最终在整个字节列中的XML是形式的;
... .. ..... ...
但我需要它的形式
... .. ..... ...
现有代码(很多代码)依赖于此列中的xml具有正确的形式.
那么有人可能会看到如何修改doc.col.query('*')
以获得所需的结果?
无论如何,我放弃了修改查询,并试图想出其他方法来完成最终结果.我现在看的是插入后的更新 - 类似于;
update mytable set wholenodecolumn.modify('insert- as first before * ')
如果我可以这样做
.modify('insert as last after * ')
这样会很好,但一次做1不是一个选项,因为XML无效
XQuery [mytable.wholenodecolumn.modify()]: Expected end tag 'Item'
并在一起做我不知道是否可能,但我尝试了各种语法,无法开始工作.
对此问题的任何其他方法也非常感激
我相信您可以使用FOR子句指定根节点名称.
例如:
select top 1 * from HumanResources.Department for XML AUTO, ROOT('RootNodeName')
在线查看图书了解更多详情:
http://msdn.microsoft.com/en-us/library/ms190922.aspx
在这里回答我自己的问题! - 这是从评论到其他尝试的答案之一,我说:
我目前正在查询查询中的FLWOR Xquery构造.
col.query('for $item in * return
几乎就在那里,但是绕过每个节点,而不是围绕所有节点- {$item}
')
我几乎在那里有语法,一个小小的调整给了我所需要的东西;
doc.col.query('- { for $item in * return $item }
'
谢谢所有帮助过的人.我现在还有其他相关问题,但我会将其作为单独的问题发布