本文是因为看了这个帖子有感而发
http://bbs.youkuaiyun.com/topics/392295261
楼主要求:获取34进制的流水码的函数或者存储过程,0..9 A..Z 去掉IO,一共四位,每次调用增加1.
这个帖子激起了我兴趣,下面提供一个泛化的处理方式,所谓泛化指进制数任意,进制中的符号任意,函数如下:
if Object_id('NInc')is not null
drop function NInc
go
--@NCode进制码表,例如:我们熟悉的16进制为"0123456789ABCDEF",也可以自定义特殊的进制,例如三进制"ABC",这样计算就会有A+1=B,B+1=C,C+1=BA,是不是很神奇?
--@NNum 表示参与运算的N进制数 ,@Num参与运算的10十进制数
create function NInc(@NCode varchar(100),@NNum varchar(10),@Num int)
returns varchar(10)
as
BEGIN
declare @N int,@i int,@idx int,@str varchar(20)
--N进制转十进制,同时+@Num
select @N=len(@NCode),@i=0,@NNum=reverse(@NNum)
while @i<len(@NNum)
begin
set @idx=charindex(substring(@NNum,@i+1,1),@NCode)-1
set @Num=@Num+ @idx*power(@N,@i)
set @i=@i+1
end
set @str=''
--十进制转N进制
while @Num<>0
begin
select @str=substring(@NCode,(@Num % @n)+1,1)+@str
set @Num=@Num/@N
end
if @Num=0 and @str=''
set @str=Left(@NCode,1)
return @str
END
go
测试:
select A=dbo.Ninc('0123456789ABCDEF','F',1),B=dbo.Ninc('0123456789ABCDEF','1B',1)
返回
A B
---------- ----------
10 1C
是我们需要的结果
再试一下特殊码表的运算:
select c1=dbo.Ninc('abc','a',1),c2=dbo.NInc('abc','c',1),c3=dbo.NInc('abc','c',2)
返回
c1 c2 c3
---------- ---------- ----------
b ba bb
完美实现基于abc符号的三进制运算