家长问题 - 多亏了Iamdave,部分问题得到了解决。现在的挑战是在已经设置了以下排序规则的数据库中使搜索不区分大小写:COLLATE Latin1_General_CS_AS
我正在使用这个查询,但它不起作用 - 无法匹配测试,测试,只能匹配测试
UPDATE dbo.BODYCONTENT
SET BODY = LTRIM(RTRIM(REPLACE(
REPLACE(
REPLACE(N' ' + CAST(BODY AS NVARCHAR(MAX))
+ N' ', ' ', '<>'), '>TEST<', '>Prod<'), '<>', ' ')))
FROM dbo.BODYCONTENT
WHERE BODY COLLATE Latin1_General_CI_AS LIKE '%TEST%' COLLATE Latin1_General_CI_AS;
如何使替换函数中的搜索字符串匹配不区分大小写
其他查询和结果:
UPDATE dbo.BODYCONTENT SET BODY =
ltrim(rtrim(replace(replace(
replace(N' ' + cast(BODY as nvarchar(max)) + N' ' ,' ','<>')
,'>Test<','>Prod<),'<>',' ')))
from dbo.BODYCONTENT WHERE lower(BODY) like '%test%';
结果:参数数据类型 ntext 对于下层函数的参数 1 无效。
根据注释,使用LOWER
会更容易
where lower(body) like '%test%'
你在那里拥有的东西应该有效,除非有一些假设被排除在问题之外(例如实际上没有像你想象的那样被整理,或者测试行实际上不存在。
您可以通过几种方式执行此操作。正如 scsimon 指出的那样,您可以简单地进行小写比较。这可能是最直接的。
您还可以像现在一样显式整理列。不过,您不需要专门整理'%TEST%'
字符串(除非我弄错了;在我的机器上没有必要。我想默认数据库设置可能会否定这个参数(。
最后,另一种选择是在表上有一个计算列,这是字段的不区分大小写的版本。这基本上与前面的方法相同,但它是表定义的一部分。
declare @t table
(
body nvarchar(max) collate Latin1_General_CS_AS,
body_Insensitive as body collate Latin1_General_CI_AS
)
insert into @t
values ('test'), ('Test'), ('TEST')
select * from @t where BODY collate Latin1_General_CI_AS like '%test%' collate Latin1_General_CI_AS;
select * from @t where lower(body) like '%test%'
select * from @T where body_Insensitive like '%TeSt%'