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

时间:2014-11-14 19:02:31

标签: sql-server coldfusion

我正在使用ColdFusion 9来访问SQL Server 2008数据库。数据库设置为使用区分大小写的排序规则。我想对它进行不区分大小写的搜索。类似的东西:

 select field
 from table
 where field2 = 'test'  COLLATE SQL_Latin1_General_CP1_CI_AS

复杂之处在于我的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中,该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,...">)

4 个答案:

答案 0 :(得分:1)

如果将collat​​e语句放在IN子句之前,它就可以工作:

WHERE Column COLLATE SQL_Latin1_General_CP1_CI_AS IN 
      ( 
        <cfqueryparam value="TEST1,TEST2,TEST3" 
             cfsqltype="cf_sql_varchar"
             list="true">
      ) 

但是,我认为绑定变量可能会导致它产生意想不到的副作用。当我之后直接重新运行完全相同的查询 - 只是没有 COLLATE - 它仍然执行不区分大小写的搜索。

WHERE Column IN 
      ( 
        <cfqueryparam value="TEST1,TEST2,TEST3" 
             cfsqltype="cf_sql_varchar"
             list="true">
      ) 

但是以某种方式更改查询,因此不会缓存执行计划(例如将AND 1 = 1添加到where子句),结果又区分大小写。请记住一些事情。

<强>更新

为避免缓存问题,一种可能性是使用派生表。然后将collat​​e语句应用于SELECT列表而不是IN子句:

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建议的那样更改列的排序规则。

答案 1 :(得分:0)

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

ALTER DATABASE MyDatabase
COLLATE SQL_Latin1_General_CP1_CI_AS ;

答案 2 :(得分:0)

如果您愿意,可以ALTER列的区分大小写。

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

来源: http://blog.sqlauthority.com/2007/04/30/case-sensitive-sql-query-search/

答案 3 :(得分:0)

另一种方法是根据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子句中使用函数会降低生产速度。为了解决这个问题,如果您认为值得,可以在表中创建一个持久计算列并将其编入索引。