选择查询以从xml列中删除节点

时间:2011-05-31 12:28:36

标签: sql xpath

我有一个包含XML列的表,其中包含2个具有大base64字符串(图像)的节点。当我查询数据库时,我想从返回给客户端的xml中删除这两个节点。我无法更改表的架构(即我无法拆分列中的数据)。如何使用select语句从xml列中删除2个节点? (要删除的节点都在其名称中包含文本“Image”)。任何单个查询都可以返回最多1000条记录。

目前,我的查询基本上是这样的:

select top 1000 [MyXmlData] from [MyTable]

MyXmlData列包含如下所示的xml:

<MyXml>
   <LotsOfNodes></LotsOfNodes>
   ...
   <ANode>
      ...
      <MyImage1></MyImage1>   <!-- remove this from returned xml -->
      <MyImage2></MyImage2>   <!-- remove this from returned xml -->
      ...
   </ANode>
   ...
   <LotsOfNodes></LotsOfNodes>
   ...
</MyXml>

我正在使用SQL Server 2008。

1 个答案:

答案 0 :(得分:3)

这是在SQL Server上测试的

您可以将查询结果存储到临时表或表变量中,并使用modify() delete Imagedeclare @T table(XmlData xml) insert into @T values ('<MyXml> <LotsOfNodes></LotsOfNodes> <ANode> <MyImage1></MyImage1> <!-- remove this from returned xml --> <MyImage2></MyImage2> <!-- remove this from returned xml --> </ANode> <LotsOfNodes></LotsOfNodes> </MyXml>') update @T set XmlData.modify('delete //*[contains(local-name(.), "Image")]') select * from @T 个节点。使用contains()local-name()确定是否应删除节点。

<MyXml>
  <LotsOfNodes />
  <ANode>
    <!-- remove this from returned xml -->
    <!-- remove this from returned xml -->
  </ANode>
  <LotsOfNodes />
</MyXml>

结果:

{{1}}