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