zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    win7下new出的内存默认是无执行权限的
    【转】 C++获得系统时间,以及1970年1月1日到现在的毫秒数
    【收藏】获取系统安装软件(vc++源码)
    opencv编译以及测试
    Vim命令合集
    在SSMS中打开DTS Package
    秋日的阳光
    又一位部门同事离职
    不要让你的孩子成为留守儿童,更不让你的父母成为空巢老人
    又将有一位同事离职
  • 原文地址:https://www.cnblogs.com/bwch_xm/p/4001522.html
Copyright © 2011-2022 走看看