我有一个问题,我不断从下面的查询中获取值“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]
是一个字符范围。范围内的字符取决于排序规则定义的排序顺序:db<>fiddle 在线演示
部分输出:
如您所见,许多您可能不期望的字符被定义为在该范围内排序。
要匹配某些大写字母,您需要:
或者使用排序规则,其中 AZ 范围的排序顺序符合您的要求,例如
Latin1_General_100_BIN2
.排序规则的区分大小写或不区分大小写部分仅影响相等比较。
LIKE '[A]'
将在不区分大小写的排序规则下匹配“a”和“A”,但只有“A”与区分大小写的排序规则匹配。