1,開始 昨天在CSDN上看到這一個提問帖子:《用SQL寫一個存儲過程10進位轉33進位代碼 》,原帖的問題是這樣: 急求10進位轉33進位代碼。 就是我想在SQL中創建一個存儲過程“T10TO33”可以實現將10進位的數據轉換成33進位。 33進位規則是:1,2,3,4,5,6,7,8,9,A,B ...
1,開始
昨天在CSDN上看到這一個提問帖子:《用SQL寫一個存儲過程10進位轉33進位代碼 》,原帖的問題是這樣:
急求10進位轉33進位代碼。
就是我想在SQL中創建一個存儲過程“T10TO33”可以實現將10進位的數據轉換成33進位。
33進位規則是:1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,V,W,X,Y,Z,0
字母:I、O、U不用,其餘正常流水,哪位大神幫忙寫一個,謝謝
2.分析
不同進位數據間的轉換,記得很久之前寫過類似的,參加《X進位與10進位之間的轉換》,基本的演算法是相同的。
在這裡的要求,進位轉換中,26個字母中需排除I,O,U三個字母不用,那麼原來的X進位與10進位之間轉換方法中,就不能直接使用Char()函數。需要對用到的數字和字母重新作個排序,再定位轉換。
2.1.初始化一個表變數@tb_tmp,內容如下:
declare @tb_tmp as table(id int identity(0,1) primary key,radix char(1)) ;with cte as (select top (36) row_number() over(order by getdate())-1 as id from sys.columns) insert into @tb_tmp(radix) select case when id>9 then char(55+id) else rtrim(id) end as radix from cte where char(55+id) not in ('I','O','U')
2.2 假設一個10進位的變數@input_int int=50,迴圈對@input_int除33取模(@input_int%33),得到的模,拿到2.1中的@tb_tmp匹配id,定位到對應的基數radix.即對應到33進位數據位。把得到radix寫入變數@output ( @output = 找到的radix + @output)。每次迴圈,@input_int=@input_int/33,實現10進位拆分。當@input_int=0時,退出迴圈,返回@output,作為10進位到33進位的結果值。
set @output='' while(1=1) begin select @output=Convert(nvarchar(1024),Case (@input_int%33) when 0 then rtrim(@input_int%33) else (select radix from @tb_tmp where id=@input_int%33) end+@output),@input_int=@input_int/33 if @input_int=0 break end
3.完整代碼:
if object_id('T10TO33') Is not null Drop Proc T10TO33 Go create procedure T10TO33( @input_int int, @output nvarchar(1024) output ) as set nocount on declare @tb_tmp as table(id int identity(0,1) primary key,radix char(1)) ;with cte as (select top (36) row_number() over(order by getdate())-1 as id from sys.columns) insert into @tb_tmp(radix) select case when id>9 then char(55+id) else rtrim(id) end as radix from cte where char(55+id) not in ('I','O','U') set @output='' while(1=1) begin select @output=Convert(nvarchar(1024),Case (@input_int%33) when 0 then rtrim(@input_int%33) else (select radix from @tb_tmp where id=@input_int%33) end+@output),@input_int=@input_int/33 if @input_int=0 break end go
4.測試:
declare @reuslt nvarchar(1024) exec T10TO33 0,@reuslt output print @reuslt --0 exec T10TO33 7,@reuslt output print @reuslt --7 exec T10TO33 32,@reuslt output print @reuslt --Z exec T10TO33 33,@reuslt output print @reuslt --10 exec T10TO33 34,@reuslt output print @reuslt --11 exec T10TO33 50,@reuslt output print @reuslt --1H exec T10TO33 99,@reuslt output print @reuslt --30 exec T10TO33 100,@reuslt output print @reuslt --31
(完)