EAN13标准条码算法(使用SQL实现)
时间:2010-11-12 来源:枢木
/***************************************************/
-- ISBN转为EAN13标准条码基本算法:(如:7-119-04892-5)
-- 1. 去掉末尾校验码5(711904892),前面统一加上978(图书),为:978711904892
-- 2. 从ISBN序号2开始,所有偶数位的数字(7 7 1 0 8 2)求和:a1=7+7+1+0+8+2=25
-- 3. 将a1乘以3 :a2=a1*3=25*3=75
-- 4. 从ISBN序号1开始,所有奇数位的数字(9 8 1 9 4 9)求和:b =9+8+1+9+4+9=40
-- 5. 将a2加b :c1=a2+b1=75+40=115
-- 6. 取c1的个位数 :c2=5
-- 7. 用10减去c2 :d =10-5=5
-- 8. d即为校验位数值,将它置于最后一位,得到EAN13标准条码为:9787119048925
/***************************************************/
SQL代码:
代码ALTER function [dbo].[Fn_GetEAN13BarCode](@TypeCode bigint, @CodeSeed bigint)
returns varchar(13) -- 返回标准条码 EAN13条码
as
begin
declare @BarCode varchar(13) -- EAN13条码
declare @Seed varchar(13)
declare @Check int -- 校验码
-- 校验码种子
set @Seed= cast((@TypeCode*10000000000+@CodeSeed) as varchar(13))
-- 关键算法
set @Check=10-right(( substring(@Seed,1,1)
+substring(@Seed,3,1)
+substring(@Seed,5,1)
+substring(@Seed,7,1)
+substring(@Seed,9,1)
+substring(@Seed,11,1))
+3*(substring(@Seed,2,1)
+substring(@Seed,4,1)
+substring(@Seed,6,1)
+substring(@Seed,8,1)
+substring(@Seed,10,1)
+substring(@Seed,12,1))
,1)
if @Check=10
begin
set @Check=0
end
set @BarCode=@Seed+cast(@Check as char(1))
return @BarCode
end
调用示例:
print [dbo].[Fn_GetEAN13BarCode](0,978711904892) -- 返回 9787119048925 其中5为计算出的校验码
调用综合示例:
代码ALTER function [dbo].[Fn_GetFullISBN](@ISBN varchar(20))
-- 返回13位ISBN 如:9787119048925
returns varchar(13)
as
begin
/***************************************************/
set @ISBN=isnull(@ISBN,'')
set @ISBN=replace(@ISBN,'1','1')
set @ISBN=replace(@ISBN,'2','2')
set @ISBN=replace(@ISBN,'3','3')
set @ISBN=replace(@ISBN,'4','4')
set @ISBN=replace(@ISBN,'5','5')
set @ISBN=replace(@ISBN,'6','6')
set @ISBN=replace(@ISBN,'7','7')
set @ISBN=replace(@ISBN,'8','8')
set @ISBN=replace(@ISBN,'9','9')
set @ISBN=replace(@ISBN,'0','0')
-- 去除"-"
set @ISBN=replace(@ISBN,'-','')
-- 去除" "
set @ISBN=replace(@ISBN,' ','')
/***************************************************/
declare @len int
set @len=len(@ISBN)
if @len>13
begin
set @len=13
end
set @ISBN=substring(@ISBN,1,@len)
/***************************************************/
-- 9位ISBN 如:7-119-04892 需要计算校检码
if @ISBN like '[7][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
begin
set @ISBN='978'+@ISBN
set @ISBN=dbo.Fn_GetEAN13BarCode(0,@ISBN)
end
-- 10位ISBN 如:7-119-04892-5 加978直接返回
else if @ISBN like '[7][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
begin
set @ISBN='978'+@ISBN
end
-- 12位ISBN 如:978-7-119-04892 需要计算校检码
else if @ISBN like '978[7][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
begin
set @ISBN=dbo.Fn_GetEAN13BarCode(0,@ISBN)
end
-- 13位ISBN 如:978-7-119-04892-5 直接返回
else if @ISBN like '978[7][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
begin
set @ISBN=@ISBN
end
else
begin
set @ISBN='不可识别的ISBN号'
end
return @ISBN
end