Array
(
)

Checksum T-SQL [AJUDA]

Kallel
|
MVP
    27 jan 2014

Pessoal,
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.

Alex Lekao
   - 05 fev 2014

Oi Kallel,

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?

Alex Lekao
   - 05 fev 2014

Da uma olhada neste link, acho que eh o que vc procura.

http://www.planetadelphi.com.br/dica/5197/funcao-modulo-10

Kallel
|
MVP
    10 fev 2014

Obrigado Alex,

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.

Alex Lekao
   - 10 fev 2014

Blz...

bom que ajudou.

Abraco.

Alex - Lekao