2012-08-24 108 views
1

我有一個15位數的客戶編號,我需要爲該值計算一個校驗位。 爲了拿出校驗位我使用Excel(公式如下)。T-SQL自定義函數(SQL Server 2000)

該公式基於Luhn算法(我認爲這是正確的拼寫)。 15位客戶號碼存儲在SQL Server 2000數據庫中。

我希望能夠使用T-SQL函數而不是Excel來計算此值。有沒有人知道在SQL Server 2000數據庫上如何用T-SQL完成這項工作?

Excel公式,這將使我從一個15位數字校驗碼是這樣的:

=MOD(SUMPRODUCT(-MID(TEXT(MID(A2,ROW(INDIRECT("1:"&LEN(A2))),1)*(MOD(ROW(INDIRECT("1:"&LEN(A2)))+LEN(A2)+1,2)+1),"00"),{1,2},1)),10) 
+0

你嘗試過什麼和你在哪裏有問題?有很多網站提出了實現「SQL Luhn算法」的方法,雖然這裏有很多人在發佈代碼,但SO [通常不是](http://meta.stackexchange.com/questions/tagged/plz-give-我的代碼)一個「請給我這個代碼」網站。道歉,如果那不是你的意圖。 – Pondlife

+0

如果你想控制SIRET,你可以使用這個方法:https://stackoverflow.com/questions/48042117/check-siret-and-siren-french-entreprise-number/48042118#48042118 – Esperento57

回答

3
CREATE FUNCTION dbo.fnGetLuhn 
(
    @Luhn VARCHAR(7999) 
) 
RETURNS VARCHAR(8000) 
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 @Luhn + CASE WHEN @Sum % 10 = 0 THEN '0' ELSE CAST(10 - @Sum % 10 AS CHAR) END 
END 
0
declare @strCode varchar(15) 
select @strCode = '123456789' 

select 
sum 
(
    (convert(int,substring(@strCode,number,1))* ((number+1) % 2 + 1)) % 10 + 
    (convert(int,substring(@strCode,number,1))* ((number+1) % 2 + 1))/10 
) * 9 % 10 as checkdigit 
from master.dbo.spt_values 
where type='p' and number between 1 and len (@strCode) 
+0

我能找到解決方案在看到此之前在另一個董事會。謝謝(你的)信息。這是我所做的: – steve

0

以下是我使用的盧恩數字計算:

create FUNCTION dbo.[LuhnDigit] 
(
    @input nvarchar(255) 
) 
RETURNS char 
AS 
begin 

    declare @sum int = (
     select sum(comp/10+comp % 10) from (
      SELECT 
       (2-(n%2))*((ascii(substring(@input,@len-n,1))-48) % 10) as comp 
      from (SELECT row_number() over (order by (select 1))-1 as n FROM sys.objects) as a 
      where n<[email protected] 
     ) as a 
    ) 

    return cast((10 - (@sum % 10)) % 10 as char); 
END 

該函數即使對於非數字輸入也計算Luhn數字。

0

我對盧恩算法中的方法:

CREATE FUNCTION [dbo].[F_CHECK_LUHN] (@DATA VARCHAR(32)) 
RETURNS BIT AS 

BEGIN 
-- valeurs limites 
IF @DATA IS NULL OR @DATA = '' RETURN NULL; 

DECLARE @Cpt INT = 0; 
declare @C CHAR(1); 
declare @Chiffre integer=0; 
declare @Somme integer=0; 
declare @parity integer; 
set @parity=LEN(@DATA) % 2; 

WHILE @Cpt < LEN(@DATA) 
BEGIN 

    SET @C = SUBSTRING(@DATA, @Cpt+1, 1); 

    IF @C NOT BETWEEN '0' AND '9' RETURN NULL; 

    set @Chiffre=CAST(@C AS SMALLINT); 

    if ((@Cpt % 2) [email protected]) 
    begin 
    set @[email protected]*2; 

     if (@Chiffre>9) 
     begin 
     set @[email protected]; 
     end; 

    end; 

    set @[email protected][email protected]; 

    SET @Cpt = @Cpt + 1; 
END; 

RETURN CASE WHEN @Somme % 10 = 0 THEN 1 ELSE 0 end ; 

END;