Sql server SQL Server不区分大小写的查询

Sql server SQL Server不区分大小写的查询,sql-server,tsql,collation,case-sensitive,case-insensitive,Sql Server,Tsql,Collation,Case Sensitive,Case Insensitive,在使用SQL Server比较查询中的字符串时,我希望忽略大小写。到目前为止,我可以使用以下方法: SELECT * FROM Venue WHERE Name COLLATE Latin1_general_CI_AI Like '%cafe%' COLLATE Latin1_general_CI_AI SET COLLATE Latin1_general_CI_AI; SELECT * FROM Venue WHERE Name Like '%this%'

在使用SQL Server比较查询中的字符串时,我希望忽略大小写。到目前为止,我可以使用以下方法:

SELECT *
FROM Venue
WHERE
   Name COLLATE Latin1_general_CI_AI Like '%cafe%' COLLATE Latin1_general_CI_AI
SET COLLATE Latin1_general_CI_AI;
SELECT *
    FROM Venue
    WHERE
       Name Like '%this%';
SELECT *
    FROM Venue
    WHERE
       Name Like '%that%';
...
有没有一种方法可以设置一个全局指令,使它能够影响每个查询? 大概是这样的:

SELECT *
FROM Venue
WHERE
   Name COLLATE Latin1_general_CI_AI Like '%cafe%' COLLATE Latin1_general_CI_AI
SET COLLATE Latin1_general_CI_AI;
SELECT *
    FROM Venue
    WHERE
       Name Like '%this%';
SELECT *
    FROM Venue
    WHERE
       Name Like '%that%';
...
谢谢大家!

有没有一种方法可以设置一个全局指令,使它能够影响每个查询

没有

排序规则不是应用于查询的会话属性,不能动态更改

此请求的另一个问题是区分大小写不是一个可以自行启用或禁用的选项:它是排序规则的属性,就像区分重音、区分宽度、特定字母的排列顺序等。查询可以比较多个字段,每个字段具有不同的排序规则。因此,即使您可以设置一个对会话有效的排序规则,这也可能会强制其他排序规则的列在没有被要求不区分大小写的情况下动态转换排序规则。全局会话设置也会影响排序(即TOP(n)、ORDER BY等),而不仅仅是比较

由于问题是用户希望确定每次执行是否忽略部分排序规则,因此有几个选项,但所有选项都会导致性能损失:

  • 在动态SQL中构造查询:

    DECLARE@SQL NVARCHAR(MAX),
    @校勘NVARCHAR(50);
    设置@Collation='';
    如果(@casesensitive=1)
    开始
    SET@Collation=N'collate1_general_CI_AI';
    结束;
    SET@SQL=N'SELECT*
    从场地
    其中名称'+@Collation+N'类似'%'+@SearchParam'
    +N“'''+@排序规则;
    EXEC(@SQL);
    
  • 将每个字符转换为单个字符范围内的大写和小写对。这可以在应用层中为正在搜索的参数值执行:

    • 对于默认区分大小写(不执行任何操作):
      @SearchParam='This'
    • 不区分大小写:
      @SearchParam='[tT][hH][iI][sS]'
  • 强迫所有的事情都是一样的。假设执行不区分大小写的选项是传入的附加参数:

    选择*
    从场地
    WHERE CASE@CASE不敏感
    当1时,则降低(名称)
    别称
    结束
    喜欢
    不区分大小写
    当1时,则“%”+下限(@SearchParam)+“%”
    ELSE“%”++@SearchParam++'%
    结束;
    
    或者,在查询之前执行
    LOWER()

    IF(@casensitive=1)
    开始
    设置@SearchParam=LOWER(@SearchParam);
    结束;
    挑选*
    从场地
    WHERE CASE@CASE不敏感
    当1时,则降低(名称)
    别称
    结束
    类似“%”++@SearchParam++“%”;
    

  • 是否有原因不能将数据库的排序规则设置为不区分大小写的选项?()或者,可以将表中各个列的排序规则设置为不同于数据库的排序规则。不幸的是,用户希望在每次查询之前选择是否忽略大小写。相关问题:我发现最简单的方法是,如果您没有更改排序规则的权限,则使用上限或下限函数来比较数据。我以前使用过区分大小写的数据库。我理解你的痛苦!我会使用第三种变体。并将
    @SearchParam
    的处理移到查询本身之外。只是为了让它更干净一点。@VladimirBaranov是的,我曾考虑过在应用程序层中可以“降低”
    @SearchParam
    ,但对于要求对查询的调用方/实现者有这么多的信任,我并不太满意;-)。但是,这仍然是一个需要考虑的选项,因此我确实将其添加到了#3中,以及我对该方法的担忧。另外,由于#3中的CASE语句可能会出现查询优化器问题,我更倾向于选择#2,但正确的性能测试应该是决定因素:-)。实际上,我想在存储过程开始时在服务器上计算
    下限(@SearchParam)
    。在应用程序中这样做可能是不正确的(至少在理论上,如果应用程序使用的排序规则与服务器使用的排序规则不完全相同,那么应用程序中的
    ToLower
    的结果可能与服务器中的
    LOWER
    不同)。在任何情况下,当您执行诸如“%something%”之类的
    操作时,性能都会非常糟糕。
    @VladimirBaranov-Duh,这更有意义;-)。我又更新了。