Sql server SQL Server:更新以仅匹配和替换精确的单词

Sql server SQL Server:更新以仅匹配和替换精确的单词,sql-server,replace,sql-update,exact-match,Sql Server,Replace,Sql Update,Exact Match,我想匹配一个精确的单词,并用另一个单词替换它 以下是我正在使用的SQL Server查询: UPDATE BODYCONTENT SET BODY = CAST(REPLACE(CAST(BODY AS NVARCHAR(MAX)), 'Test' , 'prod') AS NTEXT) WHERE BODY COLLATE Latin1_General_CI_AS LIKE '%Test%' COLLATE Latin1_General_CI_AS; 此查询正在执行的操作: “Test”

我想匹配一个精确的单词,并用另一个单词替换它

以下是我正在使用的SQL Server查询:

UPDATE BODYCONTENT 
SET BODY = CAST(REPLACE(CAST(BODY AS NVARCHAR(MAX)), 'Test' , 'prod') AS NTEXT) 
WHERE BODY COLLATE Latin1_General_CI_AS LIKE '%Test%' COLLATE Latin1_General_CI_AS;
此查询正在执行的操作:

“Test”、“Test”、“Test”更新为“prod”——这是预期的

“Test2”、“TestTest”、“faster”更新为“prod”-我想避免这种行为

请帮忙

我尝试了其他问题,但没有成功:

UPDATE BODYCONTENT 
SET BODY = CAST(REPLACE(CAST(BODY AS NVARCHAR(MAX)), 'Test' , 'prod') AS NTEXT) 
WHERE BODY COLLATE Latin1_General_CI_AS LIKE '%[^A-Za-z0-9]Test[^A-Za-z0-9]%' COLLATE Latin1_General_CI_AS;
当我使用以下查询选择“测试”时:

SELECT * 
FROM dbo.BODYCONTENT 
WHERE CONVERT(NVARCHAR(MAX), BODY) = N'Test';
它没有归还任何东西。但我可以通过以下查询获得结果:

  SELECT BODY 
  FROM dbo.BODYCONTENT 
  WHERE BODY LIKE '%Test%';

  SELECT BODY 
  FROM dbo.BODYCONTENT 
  WHERE BODY COLLATE Latin1_General_CI_AS like '%TEST%' COLLATE Latin1_General_CI_AS;
以下是列值:

Test testtest Test1 Test TEST
预期结果:

prod testtest Test1 prod prod
当前结果:

prod prodprod prod1 prod prod

我得到的印象是,所有不同版本的
test
都在同一行值内,这就是为什么您说建议的
如“test”
不起作用的原因

基于此,以下内容相当难看,但符合您的要求:

declare @t table(s ntext);
insert into @t values('Test testtest Test1 Test TEST');

select s as Original
        ,ltrim(rtrim(replace(
                            replace(
                                    replace(N' ' + cast(s as nvarchar(max)) + N' '  -- Add a single space before and after value,
                                            ,' ','<>'                               -- then replace all spaces with any two characters.
                                            )
                                    ,'>test<','>prod<'      -- Use these two characters to identify single instances of 'test'
                                    )
                            ,'<>',' '       -- Then replace the delimiting characters with spaces and trim the value.
                            )
                    )
            ) as Updated
from @t;


使用
代替空格是由于SQL Server在字符串比较中忽略尾随空格的默认行为。这些字符可以是任意两个字符,但我发现它们在美学上是令人愉悦的。

我得到的印象是,所有不同版本的
test
都在同一行值内,这就是为什么您说建议的
类似于“test”
不起作用的原因

基于此,以下内容相当难看,但符合您的要求:

declare @t table(s ntext);
insert into @t values('Test testtest Test1 Test TEST');

select s as Original
        ,ltrim(rtrim(replace(
                            replace(
                                    replace(N' ' + cast(s as nvarchar(max)) + N' '  -- Add a single space before and after value,
                                            ,' ','<>'                               -- then replace all spaces with any two characters.
                                            )
                                    ,'>test<','>prod<'      -- Use these two characters to identify single instances of 'test'
                                    )
                            ,'<>',' '       -- Then replace the delimiting characters with spaces and trim the value.
                            )
                    )
            ) as Updated
from @t;



使用
代替空格是由于SQL Server在字符串比较中忽略尾随空格的默认行为。这些字符可以是任意两个字符,但我发现它们在美学上令人愉悦。

ntext
text
、和
image
数据类型将在SQL Server的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用
nvarchar(max)
varchar(max)
varbinary(max)
。我认为,如果只使用
如“test”
而不是
如“%test%”
它将只匹配字符串“test”,而不考虑大小写。%字符作为通配符,将匹配任何内容。@JohnRC,如“test”不返回任何内容。这里的ntext数据类型只是增加了一种不必要的复杂程度。十多年来,该数据类型一直被弃用,取而代之的是nvarchar(max)。尽管如此,我认为问题在于你只想在一个更大的字符串中改变整个单词。要实现这一点,您需要将字符串拆分为单词。为此,您需要一个字符串拆分器。根据版本的不同,它可能有也可能没有字符串分割。然后,您将能够仅用整个单词匹配替换这些单词。最后你必须把这些词重新组合起来。我想在这里添加对这篇文章的引用:
ntext
text
、和
image
数据类型将在SQL Server的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用
nvarchar(max)
varchar(max)
varbinary(max)
。我认为,如果只使用
如“test”
而不是
如“%test%”
它将只匹配字符串“test”,而不考虑大小写。%字符作为通配符,将匹配任何内容。@JohnRC,如“test”不返回任何内容。这里的ntext数据类型只是增加了一种不必要的复杂程度。十多年来,该数据类型一直被弃用,取而代之的是nvarchar(max)。尽管如此,我认为问题在于你只想在一个更大的字符串中改变整个单词。要实现这一点,您需要将字符串拆分为单词。为此,您需要一个字符串拆分器。根据版本的不同,它可能有也可能没有字符串分割。然后,您将能够仅用整个单词匹配替换这些单词。最后,你得把这些词重新拼凑起来。我想在这里补充一下这篇文章:非常感谢!这就是我想要的。谢谢你的帮助。不用担心,很高兴你把它整理好了:)我还有一个问题。我在db-Latin1_General_CS_AS中设置了此排序规则。这使得搜索区分大小写,我如何搜索我的搜索字符串不区分大小写?提示:下面的sql适合我:更新BODYCONTENT SET BODY=CAST(替换(CAST(BODY as nvarchar(max)),'test','prod')as ntext),其中BODY将拉丁1_General_CI_排序为'%test%'将拉丁1_General_CI_排序为;我想我必须使用where子句。这是一个简洁的解决方案+1-只是一个建议:使用substring而不是像这样的ltrim和rtrim:
substring(REPLACE(REPLACE('>')+CAST(@txt AS Varchar(MAX))+'testprod非常感谢!这是我想要的。我感谢你的帮助。不用担心,很高兴你把它整理好:)我还有一个问题。我在我的db-Latin1_General_CS_AS中设置了这个排序规则。这使得搜索区分大小写,如何搜索不区分大小写的搜索字符串?提示:下面的sql对我有效:更新BODYCONTENT set BODY=CAST(替换(CAST(BODY AS nvarchar(max)),'test','prod')AS ntext)WHERE BODY COLLATE Latin1_General_CI_AS like“%test%”COLLATE Latin1_General_CI_AS;我想我必须使用WHERE子句。这是一个简洁的解决方案+1-只是一个建议:使用子字符串而不是ltrim和rtrim,如下所示:
substring(REPLACE(REPLACE('>')+CAST(@txt AS Varchar(MAX))+'testprod