terça-feira, 27 de março de 2012

Formatar CPF em SQL

Store function para formatar CPF em SQL Server

IF EXISTS (
            SELECT * 
              FROM sys.objects 
             WHERE object_id = OBJECT_ID(N'[dbo].[usf_formata_cpf]') 
               AND type IN (N'FN')
           )
 DROP FUNCTION dbo.usf_formata_cpf;
GO

CREATE FUNCTION dbo.usf_formata_cpf(@cpf varchar(max), @mascara bit) RETURNS varchar(max) 
AS
-- Nome Artefato/Programa..: usf_formata_cpf.sql
-- Autor(es)...............: Emerson Hermann (emersonhermann [at] gmail.com) O Peregrino (http://www.emersonhermann.blogspot.com) 
-- Data Inicio ............: 21/02/2012
-- Data Atualizacao........: 21/02/2012
-- Versao..................: 0.01
-- Compilador/Interpretador: T-SQL (Transact SQL) 
-- Sistemas Operacionais...: Windows
-- SGBD....................: MS SQL Server 2005/2008
-- Kernel..................: Nao informado!
-- Finalidade..............: Store Procedure (Function) para mascara o numero do CPF
-- OBS.....................: A entrada é um varchar e o retorno é um varchar formatado do cpf, parametro mascara setado em 0 apenas string com zeros, 1 formata o cpf de fato 
-- ........................: 
--  
BEGIN

  DECLARE @cpf_temp varchar(max) 
  
  -- Pre-validacao 1, se e nulo, entao retorna nulo
  IF @cpf IS NULL BEGIN
     RETURN (@cpf)  
  END --fim_se      

  -- Pre-validacao 2, se e diferente de 11 digitos , entao retorna 0 
  IF LEN(@cpf) > 11 BEGIN
     RETURN (@cpf)
  END --fim_se
  
  -- Pre-validacao 3, se e tem alguma letra no cpf, entao retorna 0 
  IF (SELECT CASE WHEN patindex('%[^0-9]%', @cpf) > 0 THEN 1 ELSE 0 END) = 1 BEGIN
     RETURN (@cpf)
  END --fim_se  

  -- Pre-validacao 4, se e menor que 11 dig, pode ser oriundo de um bigint, entao colocar zeros a frente
  SET @cpf_temp = @cpf 
  IF LEN(@cpf) < 11 BEGIN
     SET @cpf_temp = REPLICATE('0',11-LEN(@cpf))+@cpf
  END --fim_se 
  
  -- Se e para formatar mesmo 
  IF @mascara = 1 BEGIN
     SET @cpf_temp = SUBSTRING(@cpf_temp,1,3) + '.' + SUBSTRING(@cpf_temp,4,3) + '.' + SUBSTRING(@cpf_temp,7,3) + '-' + SUBSTRING(@cpf_temp,10,2) 
  END --fim_se 
  
  RETURN (@cpf_temp) 
  
END;
GO

-- chamada da function 

--SELECT dbo.usf_formata_cpf('481604472z',0);
--SELECT dbo.usf_formata_cpf('0541371479',1);
--SELECT dbo.usf_formata_cpf('05413714793',1);
--SELECT dbo.usf_formata_cpf(18404,1);
--SELECT dbo.usf_formata_cpf(18404,0);

3 comentários:

  1. Querido, meu SQL 2008 não cria esta função nem a marretada. Dá erro e nao consigo descobrir o motivo...:(

    ResponderExcluir