Sql-Server

區分大小寫不起作用

  • June 21, 2022

我有一個問題,我不斷從下面的查詢中獲取值“CtP_PETER_Fact”。它應該是區分大小寫的 where 子句。我嘗試了幾種不同的方式:在選擇中的“Where ObjectName”之後設置 COLLATE 語句,在正則表達式之後設置並使用排序規則創建列。我不斷得到我沒想到的輸出。我的正則表達式可能有問題嗎?我也對正則表達式做了很多試驗,但似乎無法讓它發揮作用。

IF OBJECT_ID('tempdb..#nameFacts') IS NOT NULL
DROP TABLE #nameFacts;


CREATE TABLE #nameFacts (


   objectname varchar(200) COLLATE SQL_Latin1_General_CP1_CS_AS,
   ObjectType varchar(40)

)


insert into #nameFacts (objectname, ObjectType)
values
('BPD_Inslap_Fact','Fact')
,('CTP_HENK_FACT','Fact')
,('CTP_PETER_Fact','Fact')
,('CTP_PETER_FACT','Fact')
,('CtP_PETER_Fact','Fact')
,('C0P_PETER_Fact','Fact')
,('C0P_PETER_FACT','FACT')


SELECT *
FROM #nameFacts
WHERE
ObjectName --COLLATE SQL_Latin1_General_CP1_CS_AS 
           LIKE '[A-Z0-9][A-Z][A-Z][_][A-Z][A-Z][A-Z][A-Z][A-Z][_][F][a][c][t]' --COLLATE SQL_Latin1_General_CP1_CS_AS


IF OBJECT_ID('tempdb..#nameFacts') IS NOT NULL
DROP TABLE #nameFacts;

我不斷得到下面的輸出,我不希望值’CtP_PETER_Fact’。我在 SQL Server 2016 SP2 CU 17 上。

輸出

[A-Z]是一個字元範圍。範圍內的字元取決於排序規則定義的排序順序:

SELECT 
   SV.number, 
   CHAR(SV.number) 
FROM master.dbo.spt_values AS SV
WHERE 
   SV.[type] = 'P'
   AND SV.number BETWEEN 1 AND 255
   AND CHAR(SV.number) COLLATE SQL_Latin1_General_CP1_CS_AS LIKE '[A-Z]'
ORDER BY 
   CHAR(SV.number) COLLATE SQL_Latin1_General_CP1_CS_AS ASC;

db<>fiddle 線上展示

部分輸出:

如您所見,許多您可能不期望的字元被定義為在該範圍內排序。

要匹配某些大寫字母,您需要:

[ABCDEFGHIJKLMNOPQRSTUVWXYZ]

或者使用排序規則,其中 AZ 範圍的排序順序符合您的要求,例如Latin1_General_100_BIN2.

排序規則的區分大小寫或不區分大小寫部分僅影響相等比較。LIKE '[A]'將在不區分大小寫的排序規則下匹配“a”和“A”,但只有“A”與區分大小寫的排序規則匹配。

引用自:https://dba.stackexchange.com/questions/313557