2011-07-11 130 views
4

我对SQL相当陌生,我试图过滤和更改包含购买订单的XML文档的列内部的值。 下面是XML文档的外观和我要搜索的内容的示例。SQL服务器2008 R2中的XML查询/修改问题r2

<TenderLines> 
    <TenderLineItem> 
    <tenderTypeId>S0001-00000001</tenderTypeId> 
    .. 
    .. 
    </TenderLineItem> 
    <TenderLines> 

我有6000多行,并不是所有的都有相同的tenderTypeId。我想过滤掉tenderTypeId中具有'S0001-00000001'的值并将它们更改为'2'

到目前为止,这是我想到的。

USE LSPOS80 
DECLARE @replacement as varchar(50) 
DECLARE @redundant as varchar(50) 
SET @replacement = '2' 
SET @redundant = 'S0001-00000001' 

Update dbo.POSISTRANSACTIONTABLE 
SET TRANSACTIONXML.modify 
('replace value of(/RetailTransaction/TenderLines/TenderLineItem/tenderTypeId/@redundant) [1] with sql:variable("@replacement")') 

成功执行的查询,但没有什么变化,我想知道如果你们能读在这个并可能给我的提示。

感谢您的时间,最好的问候,Valdi。

P.S.我使用的Microsoft SQL Server 2008 R2 - 速成版

回答

3
update dbo.POSISTRANSACTIONTABLE set 
    TRANSACTIONXML.modify('replace value of (/TenderLines/TenderLineItem/tenderTypeId/text())[1] with (sql:variable("@replacement"))') 
where XMLCol.exist('/TenderLines/TenderLineItem/tenderTypeId[. = sql:variable("@redundant")]') = 1 

东西来测试:

declare @T table(XMLCol xml) 
insert into @T values 
('<TenderLines> 
    <TenderLineItem> 
    <tenderTypeId>S0001-00000001</tenderTypeId> 
    </TenderLineItem> 
</TenderLines>'), 
('<TenderLines> 
    <TenderLineItem> 
    <tenderTypeId>S0003-00000003</tenderTypeId> 
    </TenderLineItem> 
</TenderLines>') 

DECLARE @replacement as varchar(50) 
DECLARE @redundant as varchar(50) 
SET @replacement = '2' 
SET @redundant = 'S0001-00000001' 

update @T set 
    XMLCol.modify('replace value of (/TenderLines/TenderLineItem/tenderTypeId/text())[1] with (sql:variable("@replacement"))') 
where XMLCol.exist('/TenderLines/TenderLineItem/tenderTypeId[. = sql:variable("@redundant")]') = 1 

select * 
from @T 

请注意,这只会在XML的每一行更换tenderTypeId的一个值。如果xml中有多个tenderTypeId(在一行中),并且您想要替换它们,则需要将更新语句置于while循环中,并更换为where XMLCol.exist('/TenderLines/TenderLineItem/tenderTypeId[. = sql:variable("@redundant")]') = 1

+0

非常感谢你,这工作像一个魅力。 最后两个问题,如果你不介意,那么[1]在.modify行代表什么?我还想知道.exist子句中的= 1。 –

+0

@Ástvaldur - '[1]'表示选择与xquery表达式匹配的第一个节点,因为XMLCol.modify只能在此处一次更新一个值。 'XMLCol.exist()'返回0或1,其中1表示xquery发出了命中。 –

+0

再次感谢,伟大的解决方案。 –