SQL Server-在设置COLLATE Latin1_General_CS_AS的位置搜索不区分大小写

时间:2018-06-22 16:54:27

标签: sql sql-server replace collation case-insensitive

Parent question - 感谢Iamdave,部分问题得以解决。现在的挑战是,在已经设置以下排序规则的数据库中使搜索不区分大小写:COLLATE Latin1_General_CS_AS

我正在使用此查询,但它不起作用-无法匹配测试,测试,只能匹配TEST

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;  

如何在replace函数中使搜索字符串不区分大小写

其他查询和结果:

    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无效。

2 个答案:

答案 0 :(得分:1)

根据评论,仅使用LOWER

where lower(body) like '%test%'

答案 1 :(得分:0)

您在那里拥有的应该可以正常工作,除非有一些假设被排除在问题之外(例如未像您认为的那样进行整理,或者实际上没有测试行。

您可以通过几种方法执行此操作。正如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%'