quinta-feira, 28 de janeiro de 2010

Função Modulo 10, para SQL Server, muito usada para calculo de digitos verificadores SQL Server

Conforme eu havia publicado em Junho de 2004 (http://www.linhadecodigo.com/Dica.aspx?id=1157)

Função Modulo 10, para SQL Server, muito usada para calculo de digitos verificadores SQL Server, muito usado em boletos bancários e validação de cartões de crédito e etc.

CREATE FUNCTION Modulo10(@numero varchar(15))
RETURNS CHAR(1)
AS
BEGIN

declare
@max smallint,
@contador smallint,
@peso varchar(24),
@resto smallint,
@valor smallint,
@soma int,
@retorno int
select @peso = '121212121212121212121212'
select @max = datalength(@numero)
select @peso = right(@peso, @max)
set @contador = @max+1
set @soma = 0
loop:
set @contador = @contador-1
set @valor = isnull((ascii(substring(@peso, @contador, 1))-48) *
(ascii(substring(@numero, @contador, 1))-48), 0)

set @soma = isnull((select (case when (@valor<10)>
@valor when (@valor>9) then @valor-10 end)), 0)+@soma

set @soma = isnull((select (case when (@valor<10)>
null when (@valor>9) then 1 end)), 0)+@soma
if (@contador >1) goto loop

select @resto= sum(@soma)%10

select @retorno = case @resto when 0 then 0 else 10-@resto end

return(Convert(char(1), @retorno))

END
GO

-- Agora o teste:
SELECT dbo.Modulo10('3438')

Um comentário:

Paulo andré Moraes disse...

Ola poderia me ajudar? aparece este erro quando tento rodar no sql server
Msg 102, Level 15, State 1, Procedure Modulo10, Line 24
Incorrect syntax near '>'.
Msg 102, Level 15, State 1, Procedure Modulo10, Line 27
Incorrect syntax near '>'.
Msg 4121, Level 16, State 1, Line 3
Cannot find either column "dbo" or the user-defined function or aggregate "dbo.Modulo10", or the name is ambiguous.