2014-10-02 93 views
1

下面是一個例證我希望修改的生產數據的XML模式,我只是試圖找到ANY值「Billy」並將其替換爲「Peter」 。通配符的原因是我們必須用很多值和很多帶有XML列的表來做到這一點,一旦我得到這個工作,我可以輕鬆地將它包裝在一個遊標中。通配符查找和替換XML:無法指定替換值

DECLARE @tbXML TABLE (ID INT , ParameterValue XML) 
declare @oldval nvarchar(max) = 'Billy' 
declare @newval nvarchar(max) = 'Peter' 

INSERT INTO @tbXML VALUES (1, '<USER>Billy</USER>') 
INSERT INTO @tbXML VALUES (2, '<USER>John</USER>') 
INSERT INTO @tbXML VALUES (3, '<USER>David</USER>') 
INSERT INTO @tbXML VALUES (4, '<USER>Nick</USER>') 



SELECT 'before', * 
FROM @tbXML 

WHILE EXISTS (SELECT 1 FROM @tbXML WHERE ParameterValue.exist('/User[(text()[1])eq sql:variable("@oldval")]')=1) 
BEGIN 

    UPDATE @tbXML 
    SET  ParameterValue.modify('replace value of (/User[(text()[1]) eq sql:variable("@oldval")] with sql:variable("@newval")') 
     WHERE ParameterValue.exist('/User[(text()[1])eq sql:variable("@oldval")]')=1 
END 

SELECT * 
FROM @tbXML 

但我得到的是:

XQuery [@tbXML.ParameterValue.modify()]: ")" was expected. 

要麼我愣神缺少")"地方(試了很多排列,相同的錯誤),或有更多的東西錯了我的做法。希望在正確的方向微調,謝謝!

回答

1

你不需要WHILE或WHERE。只是這樣做:

SELECT 'before', * 
FROM @tbXML; 

UPDATE @tbXML 
SET  ParameterValue.modify('replace value of (/USER[. = sql:variable("@oldval")]/text())[1] 
      with sql:variable("@newval")'); 

SELECT * 
FROM @tbXML; 
+0

謝謝你做的伎倆! – tpcolson 2014-10-02 22:03:57