通配符查找和替换XML:无法指定替换值
问题描述:
下面是一个例证我希望修改的生产数据的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.
要么我愣神缺少")"
地方(试了很多排列,相同的错误),或有更多的东西错了我的做法。希望在正确的方向微调,谢谢!
答
你不需要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;
谢谢你做的伎俩! – tpcolson 2014-10-02 22:03:57