Sql 通配符查找和替换XML:无法指定替换值

Sql 通配符查找和替换XML:无法指定替换值,sql,sql-server,xml,sql-server-2008,xquery,Sql,Sql Server,Xml,Sql Server 2008,Xquery,在下面的XML模式中,它举例说明了我希望修改的生产数据,我只是试图找到“Billy”的任何值,并将其替换为“Peter”。之所以使用通配符,是因为我们必须使用大量的值和包含XML列的大量表来完成这项工作,一旦我开始使用通配符,我就可以轻松地将其封装在一个游标中 DECLARE @tbXML TABLE ( ID INT , ParameterValue XML ) declare @oldval nvarchar(max) = 'Billy' declare @newval nvarchar(

在下面的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

要么我愚蠢地遗漏了一个“”(尝试了很多排列,同样的错误),要么我的方法有更大的错误。如果您能朝正确的方向轻推,我将不胜感激,谢谢

你不需要时间和地点。只要这样做:

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;
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;