sql 进制转换,支持93内的进制相互转换

功能:实现在SQL内进制的互相转换,支持从2 - 93进制内的转换,若需要支持其他字符,可以自定义@ym变量实现扩充

 1 -- =============================================
 2 -- Author:        bwch
 3 -- Create date: 2014年9月30日10:32:47
 4 -- Description:    把一个数字转换成指定进制,最大支持93进制,也可在Function内扩充@ym实现其他的转换
 5 -- =============================================
 6 ALTER FUNCTION [dbo].[BigIntToHexStr](
 7     @value BIGINT,    --需要转换的数字
 8     @jz INT = 16    --默认16进制
 9     )
10     RETURNS VARCHAR(50)    --返回值,进制转换后的字符串
11 AS
12 BEGIN
13     --可通过扩充@ym扩充其他的进制
14     DECLARE @seq VARCHAR(2000)        --字符掩码
15     DECLARE @ym VARCHAR(2000)    --掩码
16     SET @ym = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`~!@#$%^&*()-_=+[]{}\|;:",.<>/?'
17     SET @seq = SUBSTRING(@ym,1,@jz)
18     --返回值
19     DECLARE @result VARCHAR(50)
20     --取数字的字符
21     DECLARE @digit CHAR(1)
22     SET @result = SUBSTRING(@seq, (@value%@jz)+1, 1)
23     
24     WHILE @value > 0
25     BEGIN
26         SET @digit = SUBSTRING(@seq, ((@value/@jz)%@jz)+1, 1)
27         SET @value = @value/@jz
28         IF @value <> 0 
29             SET @result = @digit + @result
30     END 
31     RETURN @result
32 END
 1 -- =============================================
 2 -- Author:        bwch
 3 -- Create date: 2014年9月30日10:36:14
 4 -- Description:    把转换过的进制转换成数字
 5 -- =============================================
 6 ALTER FUNCTION [dbo].[HexStrToBigInt]
 7     (
 8         @value VARCHAR(20), --转换过的字符串
 9         @jz INT = 16        --进制,默认16进制
10     )
11     RETURNS BIGINT
12 AS
13 BEGIN
14     DECLARE @result BIGINT
15     DECLARE @ym VARCHAR(2000)    --掩码
16     SET @ym = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`~!@#$%^&*()-_=+[]{}\|;:",.<>/?'
17     DECLARE @i INT = LEN(@value) - 1
18     DECLARE @digit CHAR(1)
19     SET @result = (CHARINDEX(SUBSTRING(@value,LEN(@value),1),@ym)-1)
20     DECLARE @w INT
21     WHILE @i > 0
22     BEGIN
23         SET @digit = SUBSTRING(@value,@i,1)
24         SET @w = (CHARINDEX(@digit,@ym)-1) * POWER(@jz,(LEN(@value) - @i))
25         SET @result = @result + @w
26         SET @i = @i - 1
27     END 
28     RETURN @result
29 END

 

测试用例:

1 DECLARE @i BIGINT = 10000, @jz INT = 32
2 DECLARE @str VARCHAR(20) = dbo.BigIntToHexStr(@i,@jz)
3 PRINT '数字 ' + CAST(@i AS VARCHAR(20)) + ' 转换成' + CAST(@jz AS VARCHAR(2)) + '进制的结果为: '+ @str
4 DECLARE @r BIGINT =dbo.HexStrToBigInt(@str,@jz)
5 PRINT CAST(@jz AS VARCHAR(2)) +'进制的字符串 ' + @str + ' 转换成数字为:' + CAST(@r AS VARCHAR(20))

测试结果:

数字 10000 转换成32进制的结果为: 9OG
32进制的字符串 9OG 转换成数字为:10000

测试环境

Windows 7 x64 + SQL Server 2008 Express R2

posted @ 2014-09-30 10:45  万成  阅读(228)  评论(0编辑  收藏  举报