Split Lista SQL Server

Métodos para validar email no SQL Server 2019!

Deixo um plus para validar email em base de dados (Oracle, SQL Server, Postgres, MySQL...) na criação da tabela.

A programação tem evoluído numa velocidade incrível, entretanto os padrões ANSI do SQL têm sido mais conservadores, veja só, existem linguagens de programação que já fazem essa validação na tipagem de dados, contudo quando falamos de padrão ANSI para SQL, e ai “o buraco é mais embaixo”.

Então, encontrei duas formas simples de fazer isso, cada uma tem sua característica específica. Veja:

1ª Forma: Função

Isso mesmo, por questões de validação de parâmetros que eram passados na chamada de uma stored procedure, precisei validar um parâmetro e-mail.

Por quê? Uma questão pontual!

/*
Funcionalidade: Validar o formato de e-mails no SQL
Criado em: 01/05/2010
Criado por: Anderson Abreu
Descrição: Validar parâmetro email como variável ou Validando campos de email cadastrados em uma tabela
Regras:
*/

use master
GO

if db_id('tst_function_email') is not null
     drop database tst_function_email
go

create database tst_function_email
go

use tst_function_email
go


create or alter function dbo.fg_verifica_email ( @email varchar(150) )
returns varchar(20)
as
begin
     declare @valid varchar(20)

    if @email is not null
    begin
        set @email = lower(@email)
        set @valid = 'Não é válido'
        if @email like '[a-z,0-9,_,-]%@[a-z,0-9,_,-]%.[a-z]%'
             and @email not like '%@%@%'
             and charindex('.@',@email) = 0
             and charindex('..',@email) = 0
             and charindex(',',@email) = 0
             and charindex('''',@email) = 0
             and charindex('^',@email) = 0
             and charindex(']',@email) = 0
             and charindex('%',@email) = 0
             and right(@email,1) not like '.'
        begin
            set @valid='Válido'
        end
    end

    return @valid
end
go

-- Vamos Testar
-- FORMATOS NÃO PERMITIDOS
-- começando com @
select dbo.fg_verifica_email('@dominio.com')
-- sem sufixo de domínio
select dbo.fg_verifica_email('anderson@dominio')
-- espaço
select dbo.fg_verifica_email('po ker@dominio')
-- aspas
select dbo.fg_verifica_email('po"ker@dominio')
-- caracteres especiais
select dbo.fg_verifica_email('po$ker@dominio')
select dbo.fg_verifica_email('anderson^pokemon@dominio.com')
select dbo.fg_verifica_email('anderson]pokemon@dominio.com')
select dbo.fg_verifica_email('anderson%pokemon@dominio.com')
-- @. juntos
select dbo.fg_verifica_email('anderson@.dominio.com')
-- 2 arrobas juntos
select dbo.fg_verifica_email('anderson@@dominio.com')
-- 2 arrobas separados
select dbo.fg_verifica_email('anderson@dominio@dominio.com')
-- .@ juntos
select dbo.fg_verifica_email('anderson.@dominio.com')
-- .. juntos
select dbo.fg_verifica_email('anderson@dominio..com')
-- . no final
select dbo.fg_verifica_email('anderson@dominio.ad.')

-- FORMATOS PERMITIDOS
select dbo.fg_verifica_email('anderson@dominio.com.br')
select dbo.fg_verifica_email('anderson@dominio.com')
select dbo.fg_verifica_email('anderson.abreu@dominio.com')
select dbo.fg_verifica_email('anderson_abreu@dominio.com')
select dbo.fg_verifica_email('anderson-abreu@dominio.com')
select dbo.fg_verifica_email('anderson@sistemaexpresso.net.br')
select dbo.fg_verifica_email('anderson193@dominio.com')
select dbo.fg_verifica_email('2020@2020.net.br')

-- Excluindo dados de teste
use master
go

drop database tst_ function_email
go

 

2ª Forma: Constraints na tabela

São criadas constraints na tabela, com validação REGEX. Contudo, nesse cenário, o dado é validado no momento que é persistido na tabela. Veja um código bem bacana:

 

 

 


/*
Funcionalidade: Validar o formato de e-mails no SQL
Criado em: 01/05/2010
Criado por: Anderson Abreu
Descrição: Validar persistência de dados de email em tabela com check constraints
Regras:
ck_rule_email_01
     exige formato:
     [letras-numeros-underline-traço] +
     [qualquer coisa] +
     [@] +
     [letras-numeros-underline-traço] +
     [qualquer coisa] +
     [.] +
     [letras] +
     qualquer coisa

ck_rule_email_02
     impede caracteres que não sejam: a-z 0-9 @ . _ -

ck_rule_email_03
     impede dois arrobas

ck_rule_email_04
     impede .@

ck_rule_email_05
     impede ..

ck_rule_email_06
     impede terminar com .
*/

use master
GO

if db_id('tst_constraint_email') is not null
     drop database tst_constraint_email
go

create database tst_constraint_email
go

use tst_constraint_email
go


if object_id('tb_pessoa') is not null
     drop table tb_pessoa

create table tb_pessoa (
     pk_pessoa int identity primary key,
     no_pessoa varchar(150),
     cd_email varchar(150),
     constraint ck_rule_email_01 check (cd_email like '[a-z,0-9,_,-]%@[a-z,0-9,_,-]%.[a-z]%'),
     constraint ck_rule_email_02 check (cd_email not like '%[^a-z0-9@._-]%'),
     constraint ck_rule_email_03 check (cd_email not like '%@%@%'),
     constraint ck_rule_email_04 check (cd_email not like '%.@%'),
     constraint ck_rule_email_05 check (cd_email not like '%..%'),
     constraint ck_rule_email_06 check (cd_email not like '%.')
)


-- Vamos Testar
-- FORMATOS NÃO PERMITIDOS
-- começando com @
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', '@dominio.com')
-- sem sufixo de domínio
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio')
-- espaço
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'po ker@dominio')
-- aspas
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'po"ker@dominio')
-- caracteres especiais
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'po$ker@dominio')
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson^pokemon@dominio.com')
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson]pokemon@dominio.com')
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson%pokemon@dominio.com')
-- @. juntos
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@.dominio.com')
-- 2 arrobas juntos
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@@dominio.com')
-- 2 arrobas separados
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio@dominio.com')
-- .@ juntos
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson.@dominio.com')
-- .. juntos
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio..com')
-- . no final
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio.ad.')


-- FORMATOS PERMITIDOS
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio.com.br')
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio.com')
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson.abreu@dominio.com')
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson_abreu@dominio.com')
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson-abreu@dominio.com')
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@sistemaexpresso.net.br')
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson193@dominio.com')
insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', '2020@2020.net.br')

-- Excluindo dados de teste
use master
go

drop database tst_constraint_email
go

Anderson Abreu