Checksum T-SQL [AJUDA]
27/01/2014
0
Estou utilizamos a plataforma SQL-Server no Share point e tive um problema com 8.000 registros que estão inconsistentes, algumas tuplas não corresponde o vigésimo caractere.
O caso é que os registros precisam estar com 20 dígitos, ou seja 19 dígitos que vem no plástico e o vigésimo é o Dígito Verificador DV, calculado com um Algorítmo de Luhn.
http://planetcalc.com/2464/ (Next check digit:)
Preciso de uma function ou um trigger para atualizar minhas tuplas.
Estou criando o banco.
Kallel Albuquerque
Posts
05/02/2014
Alex Lekao
Nao entendi, vc quer alguma funcao que faca o calculo que vc citou?
ou vc quer que o campo que deveria ter 20 caractares nao aceitasse menor que 20 caracteres?
05/02/2014
Alex Lekao
[url]http://www.planetadelphi.com.br/dica/5197/funcao-modulo-10[/url]
10/02/2014
Kallel Albuquerque
Eu consegui esse código:
CREATE FUNCTION fCheckNumberLuhn (
@Luhn VARCHAR(20)
)
RETURNS BIT /* true or false*/
AS
BEGIN
IF @Luhn LIKE '%[^0-9]%'
RETURN 0
DECLARE @Index SMALLINT,
@Multiplier TINYINT,
@Sum INT,
@Plus TINYINT
SELECT @Index = LEN(@Luhn),
@Multiplier = 1,
@Sum = 0
WHILE @Index >= 1
SELECT @Plus = @Multiplier * CAST(SUBSTRING(@Luhn, @Index, 1) AS TINYINT),
@Multiplier = 3 - @Multiplier,
@Sum = @Sum + @Plus / 10 + @Plus % 10,
@Index = @Index - 1
RETURN CASE WHEN @Sum % 10 = 0 THEN 1 ELSE 0 END
END
CREATE FUNCTION fCheckNumberLuhn (
@Luhn VARCHAR(20)
)
RETURNS VARCHAR(2)
AS
BEGIN
IF @Luhn LIKE '%[^0-9]%'
RETURN @luhn
DECLARE @Index SMALLINT,
@Multiplier TINYINT,
@Sum INT,
@Plus TINYINT
SELECT @Index = LEN(@Luhn),
@Multiplier = 2,
@Sum = 0
WHILE @Index >= 1
SELECT @Plus = @Multiplier * CAST(SUBSTRING(@Luhn, @Index, 1) AS TINYINT),
@Multiplier = 3 - @Multiplier,
@Sum = @Sum + @Plus / 10 + @Plus % 10,
@Index = @Index - 1
RETURN CASE WHEN @Sum % 10 = 0 THEN 1 ELSE 0 END
END
Não é nada complexo, mais funciona.
Clique aqui para fazer login e interagir na Comunidade :)