在下文中,XML模式举例说明了我希望修改的生产数据,我只是想找到“Billy”的任何值并将其替换为“Peter”。通配符的原因是我们必须使用许多值和许多带有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.
要么我在某处愚蠢地错过")"
(尝试了很多排列,同样的错误),或者我的方法有些不对劲。非常感谢在正确的方向上轻推,谢谢!
答案 0 :(得分: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;