Sql-Server
區分大小寫不起作用
我有一個問題,我不斷從下面的查詢中獲取值“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;
部分輸出:
如您所見,許多您可能不期望的字元被定義為在該範圍內排序。
要匹配某些大寫字母,您需要:
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
或者使用排序規則,其中 AZ 範圍的排序順序符合您的要求,例如
Latin1_General_100_BIN2
.排序規則的區分大小寫或不區分大小寫部分僅影響相等比較。
LIKE '[A]'
將在不區分大小寫的排序規則下匹配“a”和“A”,但只有“A”與區分大小寫的排序規則匹配。