2011-07-11 166 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

再次感謝,偉大的解決方案。 –