2014-02-21 33 views
0

我試圖找到這個問題的解決方案,並有互聯網上看看上下的性格。首先我找到了一個解決方案,但它似乎並不適用於所有情況。我不明白爲什麼。確定是否爲varchar與整理Latin1_CP_CI_AS

這裏是我的問題,我有整理工作不區分大小寫的,我不能改變我的專欄使用情況下此列敏感的排序規則。

這裏是一個樣品,我的測試:

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

字符串的UPPERLOWER值就比較原始的字符串,specificying用於比較的目的,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 

因此,0會返回如果UPPERLOWER版本字符串相匹配,否則,如果沒有匹配,那麼1將被退回。

注意區分大小寫的排序規則僅用於字符串的比較,所以沒有你的表的修改是必要的。

+0

與SQL Server 2014只是測試和它的作品。這很奇怪,因爲我發佈前測試的是聲明@passcap varchar(30)='Chanel04O!'整理Latin1_General_CS_AS,它不起作用。 –