我想在使用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%';
...
谢谢!
答案 0 :(得分:4)
有没有办法设置一个全局指令,以便它会影响每个查询?
没有
排序规则不是适用于查询的会话属性,也不能动态更改。
此请求的另一个问题是区分大小写不是可以自行启用或禁用的选项:它是排序规则的属性,就像重音敏感度,宽度敏感度,特定字母的顺序查询可以比较多个字段,每个字段具有不同的排序规则。因此,即使您可以设置对会话有效的排序规则,也可能会强制其他排序规则的列在即使被请求不区分大小写时也会动态转换排序规则。全局会话设置也会影响排序(即TOP(n),ORDER BY等),而不仅仅是比较。
由于问题是用户想要确定每次执行是否忽略部分排序规则,因此有一些选项,但都会导致一些性能损失:
在Dynamic SQL中构造查询(或多个查询):
DECLARE @SQL NVARCHAR(MAX),
@Collation NVARCHAR(50);
SET @Collation = '';
IF (@CaseInsensitive = 1)
BEGIN
SET @Collation = N'COLLATE Latin1_general_CI_AI';
END;
SET @SQL = N'SELECT *
FROM Venue
WHERE Name ' + @Collation + N' LIKE ''%' + @SearchParam
+ N'%'' ' + @Collation;
EXEC(@SQL);
将每个字符转换为单字符范围内的大写和小写对。这可以在app层中为要搜索的参数值完成:
强制一切都在同一个案件中。假设不区分大小写的选项是传入的附加参数:
SELECT *
FROM Venue
WHERE CASE @CaseInsensitive
WHEN 1 THEN LOWER(Name)
ELSE Name
END
LIKE
CASE @CaseInsensitive
WHEN 1 THEN '%' + LOWER(@SearchParam) + '%'
ELSE '%' + @SearchParam + '%'
END;
或者,在查询之前执行LOWER()
:
IF (@CaseInsensitive = 1)
BEGIN
SET @SearchParam = LOWER(@SearchParam);
END;
SELECT *
FROM Venue
WHERE CASE @CaseInsensitive
WHEN 1 THEN LOWER(Name)
ELSE Name
END
LIKE '%' + @SearchParam + '%';