Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Como formatar CNPJ, CPF e CEP com SQL Server

Você já se deparou com dados “crus” no banco, como um CNPJ sem pontos ou traços, e precisou formatá-los manualmente no sistema? Ou talvez tenha precisado tratar essa visualização direto em um SELECT ou PROCEDURE para exibir os dados já formatados para o cliente? 😬

Hoje vou te mostrar como formatar CNPJ, CPF e CEP diretamente no SQL Server, utilizando funções nativas como SUBSTRING, LEFT, RIGHT e STUFF. O processo é simples, limpo e extremamente útil — principalmente em procedures que geram relatórios, exibem dados em tela ou enviam mensagens automatizadas. Essa abordagem evita o retrabalho de formatar os dados no backend, o que pode gerar processamento desnecessário e quebrar a responsabilidade das camadas do sistema.

🧩 Por que formatar direto no SQL?

É comum e até recomendado que os dados armazenados no banco venham sem formatação, contendo apenas os números. Isso facilita operações, buscas e integrações. Mas, quando precisamos exibir os dados de forma legível — como em logs, templates ou mensagens automáticas — ter a formatação no SQL pode ser muito útil.

✅ Formatando CNPJ: 12.345.678/0001-95

SELECT 
    -- Adiciona o primeiro ponto após os 2 primeiros dígitos
    STUFF(
        -- Adiciona o segundo ponto após os 5 primeiros dígitos (já contando o ponto anterior)
        STUFF(
            -- Adiciona a barra após os 8 primeiros dígitos (contando os dois pontos anteriores)
            STUFF(
                -- Adiciona o traço após os 12 primeiros dígitos (contando os separadores)
                STUFF('12345678000195', 3, 0, '.'),  -- Resultado: 12.345678000195
            7, 0, '.'),                             -- Resultado: 12.345.678000195
        11, 0, '/'),                                -- Resultado: 12.345.678/000195
    16, 0, '-') AS CNPJ_Formatado                  -- Resultado final: 12.345.678/0001-95

✅ Formatando CPF: <em>123.456.789-01</em>

SELECT 
    -- Adiciona o primeiro ponto após os 3 primeiros dígitos
    STUFF(
        -- Adiciona o segundo ponto após os 6 primeiros dígitos (já contando o primeiro ponto)
        STUFF(
            -- Adiciona o traço após os 9 primeiros dígitos (já contando os pontos)
            STUFF('12345678901', 4, 0, '.'),     -- Resultado: 123.45678901
        8, 0, '.'),                              -- Resultado: 123.456.78901
    12, 0, '-') AS CPF_Formatado                 -- Resultado final: 123.456.789-01

✅ Formatando CEP: 12345-678

SELECT 
    -- Adiciona o traço após os 5 primeiros dígitos
    STUFF('12345678', 6, 0, '-') AS CEP_Formatado
    -- Resultado final: 12345-678

💡 Dica: Centralize a lógica em uma Procedure

Centralizar a formatação em uma procedure ajuda a organizar o código, evitar repetição e facilita a manutenção. Sempre que precisar dessas formatações, basta chamar a procedure.

CREATE PROCEDURE dbo.SP_EXIBE_CLIENTE
    @CNPJ VARCHAR(14),
    @CPF  VARCHAR(11),
    @CEP  VARCHAR(8)
AS
BEGIN
    SET NOCOUNT ON;

    CREATE TABLE #CNPJ_Formatado (CNPJ VARCHAR(18));
    INSERT INTO #CNPJ_Formatado (CNPJ)
    SELECT STUFF(STUFF(STUFF(STUFF(@CNPJ, 3, 0, '.'), 7, 0, '.'), 11, 0, '/'), 16, 0, '-');

    CREATE TABLE #CPF_Formatado (CPF VARCHAR(14));
    INSERT INTO #CPF_Formatado (CPF)
    SELECT STUFF(STUFF(STUFF(@CPF, 4, 0, '.'), 8, 0, '.'), 12, 0, '-');

    CREATE TABLE #CEP_Formatado (CEP VARCHAR(9));
    INSERT INTO #CEP_Formatado (CEP)
    SELECT STUFF(@CEP, 6, 0, '-');

    SELECT
        C.CNPJ,
        P.CPF,
        E.CEP
    FROM #CNPJ_Formatado C
    CROSS JOIN #CPF_Formatado P
    CROSS JOIN #CEP_Formatado E;

    DROP TABLE #CNPJ_Formatado;
    DROP TABLE #CPF_Formatado;
    DROP TABLE #CEP_Formatado;
END

✅ Como usar a Procedure:

EXEC dbo.sp_Formatar_Documentos
    @CNPJ = '12345678000195',
    @CPF = '12345678901',
    @CEP = '12345678'

🧾 Resultado esperado:

CNPJCPFCEP
12.345.678/0001-95123.456.789-0112345-678

⚠ Atenção!

Essas formatações presumem que os dados estão completos e sem formatação. Caso os campos venham com caracteres inválidos ou estejam incompletos, é importante validar previamente usando LEN, ISNUMERIC, ou TRY_CAST/TRY_CONVERT (se estiver usando SQL Server 2012+).

✅ Conclusão

Saber formatar diretamente no SQL Server pode acelerar tarefas de testes, visualização de dados, geração de relatórios e mensagens automáticas. Se quiser ir além, você pode transformar essas lógicas em funções reutilizáveis para aplicar sempre que necessário.

Curtiu a dica? Já precisou fazer esse tipo de formatação no SQL alguma vez? Comenta aí como você resolveu — ou que tipo de gambiarra já fez com CNPJ e CPF! 😄

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima