2011-05-31 43 views
3

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

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

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> 
+1

是否使用的是RDBMS? – 2011-05-31 13:07:32

+0

哎呀,应该包括我猜 - sql2008 – jimasp 2011-06-15 10:34:34

回答

3

这是SQL Server的测试

你可以将您的查询结果存储到临时表或表变量中,并使用modify()delete,Image节点。使用contains()local-name()来确定是否应该删除节点。

declare @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 

结果:

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

谢谢Mikael。就是这份工作。 – jimasp 2011-06-15 10:32:19