我有一个15位的客户号码,我需要为这个值计算一个校验位。
为了得到校验数字,我使用Excel(公式如下)。
这个公式是基于luhn算法(我认为这是正确的拼写)。
15位客户编号存储在SQL Server 2000数据库中。
我希望能够得到这个计算使用T-SQL函数而不是Excel有人知道如何在sql server 2000数据库上使用t-sql实现这一点吗?
从15位数字中给我一个校验位的Excel公式是:

=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)

最佳答案

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

10-06 05:07