zoukankan      html  css  js  c++  java
  • 自定义进制(万能进制)转十进制的相互转换SQLSERVER 自定义函数/存储过程版(原创)

    进制的原理很简单,就是把传入的字符串进行拆解,然后进行转换,拆解后将乘以相对应位数的幂.(鄙视某些人不用进来看直接就点“反对”)
    万能进制与十进制的转换SQLServer自定义函数版:

    IF EXISTS (SELECT TOP 1 0 FROM Sysobjects WITH (NOLOCK) WHERE [name]='Fn_String2Int' AND xtype='fn')
        
    DROP Function     Fn_String2Int
    GO
    /**********************************************************************************************************************
    *        Function        : dbo.Fn_String2Int
    *       Author            : KiloNet
    *       Date            : 2009-07-23
    *        Description        : 自定義進制轉十進制,目前代码最简洁的一种
    *       Input Parameters: 
    *        @h    varchar(20)    :要转换的字符
    *        @fm    varchar(50)    :自定義進制格式

    *        Sample            :
                                SELECT DBO.Fn_String2Int('0','0123456789ABCDEF')
    *********************************************************************************************************************
    */
    CREATE  Function dbo.Fn_String2Int( 
        
    @h    varchar(20),--要转换的字符
        @fm varchar(50)    --自定义进制的字符
    )
    RETURNS BigInt
    BEGIN
        
    DECLARE @i BigInt,@r BigInt
        
    SET @r=0
        
    SET @i=1
        
    WHILE @i<=LEN(@h)
        
    BEGIN
            
    SET @r=@r+(    CharIndex(Substring(@h,@i,1),@fm ,0 )-1    )*Power(LEN(@fm),LEN(@h)-@i)
            
    SET @i=@i+1
        
    END
        
    RETURN @r
    END
    GO

    /********************************************************/
    /********************************************************/

    IF EXISTS (SELECT TOP 1 0 FROM Sysobjects WITH (NOLOCK) WHERE [name]='Fn_Int2String' AND xtype='fn')
        
    DROP Function     Fn_Int2String
    GO
    /**********************************************************************************************************************
    *        Function        : dbo.Fn_Int2String
    *       Author            : KiloNet
    *       Date            : 2009-07-23
    *        Description        :
    進制自定義進制,目前代码最简洁的一种
    *       Input Parameters: 
    *        @h    BigInt        :要转换的十进制数值
    *        @fm    varchar(50)    :自定義進制格式

    *        Sample            :
                                SELECT DBO.Fn_Int2String(239,'0123456789ABCDEF')
    *********************************************************************************************************************
    */
    CREATE  Function dbo.Fn_Int2String( 
        
    @h    BigInt,    --要转换的十进制数值
        @fm varchar(50)    --自定义进制的字符
    )
    RETURNS varchar(50)
    BEGIN
        
    DECLARE @r varchar(50),@_len int
        
    SET @r=''
        
    SET @_len = LEN(@fm)
        
    WHILE @h/@_len>0
        
    BEGIN
            
    SET @r= Substring(@fm,@h % @_len+1,1+ @r
            
    SET @h=@h/@_len
        
    END
        
    IF @h>0
            
    SET @r=Substring(@fm,@h % @_len+1,1)+@r
        
    IF LEN(@r)=0
            
    SET @r = 0
        
    RETURN @r
    END
    GO


    自定义进制转十进制代码:

    IF EXISTS(SELECT TOP 1 0 FROM SysObjects WITH (NOLOCK) WHERE [name]='String2Int' AND XType='P')
        
    Drop PROC String2Int
    GO
    /**********************************************************************************************************************
    *        Procudure        : dbo.String2Int
    *       Author            : KiloNet
    *       Date            : 2009-07-22
    *        Description        : 自定義進制轉十進制
    *       Input Parameters: 
    *        @h    varchar(20)    :自定義進制格式的字符串
    *        @fm    varchar(50)    :自定義進制格式
    *        @r    bigint output:返回值

    *        Sample            :
                                DECLARE @r BigInt
                                EXEC String2Int 'X','0123456789XYZ',@r output
                                SELECT @r
    *********************************************************************************************************************
    */
    CREATE PROC DBO.String2Int(
        
    @h    varchar(20),--'Y'
        @fm varchar(50),--'0123456789XYZ'
        @r    bigint output 
    )
    AS
    DECLARE @_sql nvarchar(4000),@_len int 

    SET @_sql = '
    declare @i bigint
    set @r=0
    set @i=1
    while @i<=len(
    '''+@h+''')
    begin
        set @r=@r+
        (    
            CharIndex(substring(
    '''+@h+''',@i,1),'''+@fm+''' ,0 )-1
        )
        *power(
    '+ Convert(varchar(20),LEN(@fm)) +',len('''+@h+''')-@i)
        set @i=@i+1
    end
    '
    print @_sql
    EXEC  sp_executesql   @_sql,N'@r bigint  output',@r   output  
    GO

    /*
    進制的原理很簡單,比如16進制轉10進制的算法:
    十六進制:0123456789ABCDEF
    0對應0
    1對應1
    ..
    A對應10
    B對應11
    ..

    此算法就是把傳入的字符串進行拆解,然后進行轉換,拆解后將乘以相對應位數的冪
    A1分拆:

    A                2
    10*power(16,1)+ 2*power(16,0)

    測試如下:

    SELECT 10*power(16,1)+ 2*power(16,0)

    DECLARE @r BigInt
    EXEC String2Int 'A2','0123456789ABCDEF',@r output
    SELECT @r

    結果都是162
    */


    十进制转自定义进制代码:

    IF EXISTS(SELECT TOP 1 0 FROM SysObjects WITH (NOLOCK) WHERE [name]='Int2String' AND XType='P')
        
    Drop PROC Int2String
    GO
    /**********************************************************************************************************************
    *        Procudure        : dbo.Int2String
    *       Author            : KiloNet
    *       Date            : 2009-07-22
    *        Description        : 十进制转自定义进制
    *       Input Parameters: 
    *        @h    BigInt        :十进制
    *        @fm    varchar(50)    :自定义进制格式
    *        @r    varchar(50) output:返回值
    *        Sample            :
                                DECLARE @r varchar(50)
                                EXEC Int2String 25,'0123456789XYZ',@r output
                                SELECT @r
    *********************************************************************************************************************
    */
    CREATE PROC DBO.Int2String(
        
    @h    BigInt    ,--12
        @fm varchar(50),--'0123456789XYZ'
        @r    varchar(50) output 
    )
    AS

    DECLARE @_sql nvarchar(4000),@_len varchar(20
    SET @_len = Convert(varchar(20),LEN(@fm))
    SET @_sql = '
    Declare @_i bigint
    SET @_i = Convert(bigint,
    '+ Convert(varchar(50),@h)+')

    set @r=
    ''''

    while @_i/
    '+ @_len +'>0
    begin

    set @r= substring(
    '''+@fm+''',@_i % '+ @_len +'+1,1) + @r

    set @_i=@_i/
    '+ @_len +'

    end


    if @_i>0
        set @r=substring(
    '''+@fm+''',@_i % '+ @_len +'+1,1)+@r

    '

    EXEC  sp_executesql   @_sql,N'@r varchar(50)  output',@r   output  
    GO


    /*
    进制的原理很简单,比如10进制转16进制的算法:
    十六进制:0123456789ABCDEF
    0对应0
    1对应1
    ..
    10对应A
    11对应B
    ..

    此算法就是把传入的數值按進制位數進行整除,取模得到的數即為16进制对应的字符,合并所有字符后即得结果

    */



    id 博主 = [[KILONET.CNBLOGS.COM alloc] initWithValue:@"天堂向右,我依然向左"

                  网名:@"老舟"

                  兴趣:@"影音,阅读"

                  动态:@"系统架构设计,Android通信模块开发"

                  网址:@"http://kilonet.cnblogs.com"
                  签名:@"--------------------------------------------------

                                  Stay Hungry , Stay Foolish

                                  求  知  若  渴,处  事  若  愚

                              --------------------------------------------------"

                  ];         // Never Release

  • 相关阅读:
    oracle修改字符编码
    oracle修改约束列
    oracle非空约束
    Linux修改字符集
    修改oracle字符集合
    word问题禁止宏
    增加修改表列
    oracle增加sequence
    增加 修改oracle约束条件
    oracle用户 密码永不过期
  • 原文地址:https://www.cnblogs.com/KiloNet/p/1528416.html
Copyright © 2011-2022 走看看