确定varchar的上下字符是否具有排序规则Latin1_CP_CI_AS

时间:2014-02-21 14:55:37

标签: sql-server sql-server-2008

我正在尝试找到解决此问题的方法,并在互联网上查看。首先,我找到了一个解决方案,但它似乎并不适用于所有情况。我不明白为什么。

这是我的问题,我正在使用不区分大小写的排序规则,我无法更改列的排序规则以在此列上使用区分大小写。

以下是一个示例和我的测试:

declare @passcap varchar(30)= 'Chanel04O!' collate Latin1_General_CI_AS

select case when binary_checksum(lower(@passcap)) <> binary_checksum(@passcap) and binary_checksum(UPPER(@passcap)) <> binary_checksum(@passcap) then 1 else 0 end as pass_cap
, binary_checksum(lower(@passcap)), binary_checksum(@passcap)

结果应该是1当然因为C和O是大写的。但我收到0。

所以我试图执行binary_checksum并且我收到相同的更低或正常的值:2017408143

但为什么呢?我发现了什么问题,我有数字和额外的字符(!)。

我可以想象做一个正则表达式只接受角色然后与binary_checksum比较,但是有更合适的东西吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

只需将字符串的UPPERLOWER值与原始字符串进行比较,然后根据比较的目的对Latin1_General_CS_AS排序规则进行比较:

SELECT  CASE
          WHEN @passcap = UPPER(@passcap) COLLATE Latin1_General_CS_AS THEN 0
          WHEN @passcap = LOWER(@passcap) COLLATE Latin1_General_CS_AS THEN 0
          ELSE 1
        END

因此,如果字符串的UPPERLOWER版本匹配,则返回0,否则如果两者都不匹配,则返回1。

请注意,区分大小写的排序规则仅用于比较字符串,因此无需修改表格。