前几天的开发遇到一个进制转化问题,在外部程序去实现要把大量数据抓出来,然后再处理,然后就想到了干脆在sql中使用标量函数来搞定他;根据自身业务需求就搞了这么一个,测试么问题。
当然该段代码是根据我们自身程序需求设计的,不算完全通用的进制转化;也可以自己修改一下变为通用;
话不多说,上代码:
ALTER FUNCTION [dbo].[f_tm_lsh]
-- 这个应该可以转化 32位以及 以下的进制所有的,2、4、8、10、16、32进制
-- 使用举例:
-- select dbo.f_tm_lsh('1125','',10,16)
-- select dbo.f_tm_lsh('1125','',16,2)
-- select dbo.f_tm_lsh('G3011347624064910626007U','G3011347624064910626',32,10)
(
@barcode varchar(250), -- 条码段
@regulation varchar(250), -- 条码规则段
@carryBit_BT int, -- 进制(转化前 Before transform)
@carryBit_AT int -- 进制(转化前 After transform)
)
RETURNS varchar(255)
AS
BEGIN
declare @jg as varchar(255)
declare @jg10 as int
declare @jzm as varchar(32)
declare @ls as varchar(100)
declare @index as int
declare @base_BT as varchar(1)
declare @base10 as int
declare @base_AT as varchar(1)
set @jzm ='0123456789ABCDEFGHJKLMNPQRTUVWXY'
IF @carryBit_BT in(2,4,8,10,16,32)
BEGIN
set @jg10 = 0
set @ls = right(@barcode, len(@barcode)-len(@regulation))
set @index = 1
while @index <= len(@ls)
begin
set @base_BT = SUBSTRING(@ls,@index,1)
set @base10 = charindex(@base_BT,@jzm)-1
set @jg10 = @jg10 + @base10 * power(@carryBit_BT,len(@ls)-@index)
set @index = @index+1
end
END
IF @carryBit_AT in(2,4,8,10,16,32)
BEGIN
SET @jg = SUBSTRING(@jzm, @jg10 % @carryBit_AT + 1,1)
while @jg10 > 0
begin
set @base_AT = SUBSTRING(@jzm, ((@jg10 / @carryBit_AT) % @carryBit_AT)+1, 1)
set @jg10 = @jg10 / @carryBit_AT
if @jg10 <> 0
set @jg = @base_AT + @jg
end
END
return @jg
END
有用到的兄弟姐妹,别忘了点赞关注!