Sql server 如何在SQL Server中为整个查询设置排序规则,以便执行不区分大小写的搜索?

Sql server 如何在SQL Server中为整个查询设置排序规则,以便执行不区分大小写的搜索?,sql-server,coldfusion,Sql Server,Coldfusion,我正在使用ColdFusion 9访问SQLServer2008数据库。数据库设置为使用区分大小写的排序规则。我想对它进行不区分大小写的搜索。比如: select field from table where field2 = 'test' COLLATE SQL_Latin1_General_CP1_CI_AS 复杂的是,my where子句使用IN运算符对逗号分隔的字符串值列表进行搜索。除非我在每个值后设置排序规则,否则这似乎不起作用: select field from ta

我正在使用ColdFusion 9访问SQLServer2008数据库。数据库设置为使用区分大小写的排序规则。我想对它进行不区分大小写的搜索。比如:

 select field
 from table
 where field2 = 'test'  COLLATE SQL_Latin1_General_CP1_CI_AS
复杂的是,my where子句使用IN运算符对逗号分隔的字符串值列表进行搜索。除非我在每个值后设置排序规则,否则这似乎不起作用:

 select field
 from table
 where field2 IN ('test' COLLATE SQL_Latin1_General_CP1_CI_AS, 'test2' COLLATE SQL_Latin1_General_CP1_CI_AS, ...)
我可以通过搜索和替换来实现这一点,但我也希望将此列表包含在cfQueryParam中,它本身处理分隔符。我不确定这是否可能,如果可能的话,那就变得非常混乱。因此,我想为整个查询设置排序规则。在Oracle中,这可以通过更改会话设置在查询之前完成。在SQL Server中是否可以执行类似操作,例如:

 SET COLLATE SQL_Latin1_General_CP1_CI_AS
 select field
 from table
 where field2 IN (<cfqueryparam cfsqltype="cf_sql_varchar" value="test1,test2,...">)
SET COLLATE SQL\u Latin1\u General\u CP1\u CI\u AS
选择字段
从桌子上
其中字段2位于()

SQL SERVER: 设置数据库的排序规则

ALTER DATABASE MyDatabase
COLLATE SQL_Latin1_General_CP1_CI_AS ;

如果愿意,可以
更改列的大小写敏感度

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(20) -- don't forget to change the datatype to your column's datatype
COLLATE SQL_Latin1_General_CP1_CI_AS

来源:

如果将collate语句放在IN子句之前,则该语句有效:

WHERE Column COLLATE SQL_Latin1_General_CP1_CI_AS IN 
      ( 
        <cfqueryparam value="TEST1,TEST2,TEST3" 
             cfsqltype="cf_sql_varchar"
             list="true">
      ) 
SELECT t.Column
FROM  (
        SELECT Column COLLATE SQL_Latin1_General_CP1_CI_AS AS Column
        FROM YourTable
      ) t 
WHERE t.Column IN 
      ( 
        <cfqueryparam value="TEST1,TEST2,TEST3" 
             cfsqltype="cf_sql_varchar"
             list="true">
      ) 

也就是说,如果您总是希望对此列执行不区分大小写的搜索,最好按照cfqueryparam的建议更改该列的排序规则。

另一种方法是基于varbinary结果进行搜索。例如,这将返回一条记录:

select record
from 
(select 'Fred' record) temp
where record = 'fred'
但这并不是:

select record
from 
(select 'Fred' record) temp
where cast(record as varbinary) = cast('fred' as varbinary)

它简单而有效,但在where子句中使用这样的函数往往会降低生产速度。为了避免这种情况,如果您认为值得,可以在表中创建一个持久化的计算列并为其编制索引。

谢谢,但数据库必须保持区分大小写。我需要设置只影响此查询,最好不要影响同一会话中的任何其他查询。如果将collate语句放在IN子句
之前,其中列collate SQL\u Latin1\u General\u CP1\u CI\u AS IN()
,则可以工作。但是,我认为bind变量可能会导致它产生意外的副作用。之后,当我重新运行完全相同的查询时(只是没有COLLATE),它仍然执行不区分大小写的搜索。但是以某种方式更改查询,这样执行计划就不会被缓存(如add`AND 1=1`),结果也会区分大小写。@这很好。请将此作为答复,我将接受。到目前为止,我所做的测试表明,它在我们这方面工作得非常好。我们最初考虑过类似的问题,但我们确实希望避免where子句中这些函数的性能受到影响。我们看到了类似的缓存行为,但正如您所说,它似乎只会影响完全相同的查询,因此,由于我们在其他任何地方都不使用它,我们正在推进这个解决方案。谢谢
select record
from 
(select 'Fred' record) temp
where cast(record as varbinary) = cast('fred' as varbinary)