我有一个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