关于N进制数据计算SQL原生处理

来源:互联网 发布:2017重庆最美工商人 编辑:程序博客网 时间:2024/06/02 05:34

本文是因为看了这个帖子有感而发

http://bbs.csdn.net/topics/392295261

楼主要求:获取34进制的流水码的函数或者存储过程,0..9  A..Z 去掉IO,一共四位,每次调用增加1.

这个帖子激起了我兴趣,下面提供一个泛化的处理方式,所谓泛化指进制数任意,进制中的符号任意,函数如下:

if Object_id('NInc')is not nulldrop function NIncgo--@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)asBEGINdeclare  @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  endset @str=''--十进制转N进制  while @Num<>0beginselect @str=substring(@NCode,(@Num % @n)+1,1)+@strset @Num=@Num/@N  endif @Num=0 and @str=''  set @str=Left(@NCode,1)  return @str ENDgo

测试:

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符号的三进制运算




原创粉丝点击