Eu tenho um problema em que continuo obtendo o valor 'CtP_PETER_Fact' da consulta abaixo. Deve ser uma cláusula where sensível a maiúsculas e minúsculas. Eu tentei de algumas maneiras diferentes: definindo a instrução COLLATE após 'Where ObjectName' no select, após a expressão regular e criando a coluna com o agrupamento. Eu continuo recebendo a saída que eu não esperaria. É algum problema com minha expressão regular, talvez? Também fiz muitas experiências com a expressão regular, mas não consigo fazê-la funcionar.
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;
Continuo recebendo a saída abaixo, onde não esperaria o valor 'CtP_PETER_Fact'. Estou no SQL Server 2016 SP2 CU 17.
[A-Z]
é um intervalo de caracteres. Os caracteres no intervalo dependem da ordem de classificação definida pelo agrupamento:db<>demonstração online de violino
Saída parcial:
Como você pode ver, muitos caracteres que você pode não esperar são definidos para classificar dentro desse intervalo.
Para corresponder apenas a determinados alfas maiúsculos, você precisaria:
Ou use um agrupamento em que a ordem de classificação para o intervalo AZ corresponda aos seus requisitos, por exemplo,
Latin1_General_100_BIN2
.A parte que faz distinção entre maiúsculas e minúsculas de uma ordenação afeta apenas as comparações de igualdade.
LIKE '[A]'
corresponderia a 'a' e 'A' em uma ordenação que não diferencia maiúsculas de minúsculas, mas apenas 'A' com uma ordenação que diferencia maiúsculas de minúsculas.