Tem maiúscula? – SQL Server

Boa noite, caros leitores!

Venho-lhes escrever mais uma vez! Hoje um amigo do trabalho, Varley, teve uma necessidade interessante que nos fez pensar em uma função útil a ser feita no SQL Server.

A Necessidade: retornar todos os registros que contivessem alguma letra maiúscula.

Problema: o banco de dados utiliza o collation Latin1_General_CI_AI. Esse collation não faz diferenciação de maiúsculas e minúsculas. Para lembrar um pouco sobre collations leia: https://fredyesmeraldo.wordpress.com/2011/06/10/problemas-para-pesquisar-textos-que-possam-conter-acentos-errados-collations-do-sqlserver-resolverao-seu-problema/

Solução: para conseguir fazer a comparação se é maiúscula ou não, precisamos usar um artifício do SQL Server que converte um collation de uma string. Segue abaixo os códigos para retornar se existe maiúscula e outra função que retorna se existe minúscula. Daí para frente pode-se fazer diversas variações de funções (TodasMaiusculas, TodasMiusculas),

create function dbo.TemMinuscula(@texto varchar(max))
returns bit
as
begin
declare @letras as varchar(100)
declare @i as int
declare @j as int
declare @resultado as bit
declare @saiDoLoop as bit

select
@letras = ‘abcdefghijklmnopqrstuvwxzç’,
@resultado = 0,
@i = 1,
@j = 1,
@saiDoLoop = 0

while ( @i <= LEN(@texto) ) and (@saiDoLoop = 0)
begin
while ( @j <= LEN(@letras)) and (@saiDoLoop = 0)
begin
if SUBSTRING(@texto,@i,1) collate Latin1_General_CS_AI = SUBSTRING(@letras,@j,1) collate Latin1_General_CS_AI
begin
select
@resultado = 1,
@saiDoLoop = 1
end

select @j = @j + 1
end

select @i = @i + 1
select @j = 1
end

return @resultado
end

go

——————————————————–

create function dbo.TemMaiuscula(@texto varchar(max))
returns bit
as
begin
declare @letras as varchar(100)
declare @i as int
declare @j as int
declare @resultado as bit
declare @saiDoLoop as bit

select
@letras = ‘ABCDEFGHIJKLMNOPQRSTUVWXZÇ’,
@resultado = 0,
@i = 1,
@j = 1,
@saiDoLoop = 0

while ( @i <= LEN(@texto) ) and (@saiDoLoop = 0)
begin
while ( @j <= LEN(@letras)) and (@saiDoLoop = 0)
begin
if SUBSTRING(@texto,@i,1) collate Latin1_General_CS_AI = SUBSTRING(@letras,@j,1) collate Latin1_General_CS_AI
begin
select
@resultado = 1,
@saiDoLoop = 1
end

select @j = @j + 1
end

select @i = @i + 1
select @j = 1
end

return @resultado
end

Segue abaixo exemplo de utilização:

select dbo.TemMaiuscula(‘testE’)

Retorna 1
select dbo.TemMinuscula(‘TESTE’)

Retorna 0

 

Espero que possa ter sido útil a ideia e que vocês possam criar mais variações de funções a partir dessas!

Abraço! Boa noite!

Anúncios