眾所周知,18位的身份證號碼,最后一位是校驗位,可能是0到9和X中的一個。它的校驗規(guī)則可參考。http://www.coozhi.com/youxishuma/hulianwang/23169.html
其實,很多票據(jù)號也是采用了相同的校驗位算法。這些票據(jù)號可能是10位,12位等等。它們的區(qū)別僅僅是參與計算校驗位的數(shù)字少些而已,過程是一樣的。
因此,對生成身份證校驗位的算法稍加改造,即可支持使用此類算法的票據(jù)號校驗位計算。
以下為在 Sql Server 中的自定義函數(shù),可以用來直接為流水的票據(jù)號計算變幻莫測的最后一位。
create function [dbo].[f_nums_check_code](@nums varchar(17)) returns varchar(1)
as
begin
declare @ms nvarchar(17)
declare @i int
declare @sum int
if(LEN(@nums)>17) return null;
set @ms = RIGHT('79058421637905842', LEN(@nums))
set @i = 1
set @sum = 0
while @i<=len(@nums)
begin
set @sum = @sum + cast(substring(@nums, @i, 1) as int) * (cast(substring(@ms, @i, 1) as int)
+ (case substring(@ms, @i, 1) when '0' then 10 else 0 end))
set @i = @i + 1
end
return substring('10X98765432', @sum%11+1, 1)
end
調(diào)用舉例:
select bill_no,
bill_no + dbo.[f_nums_check_code](bill_no) as bill_code
from bill_info
bill_code 妥妥的。