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

  • 相关阅读:
    [模板] 循环数组的最大子段和
    [最短路][几何][牛客] [国庆集训派对1]-L-New Game
    [洛谷] P1866 编号
    1115 Counting Nodes in a BST (30 分)
    1106 Lowest Price in Supply Chain (25 分)
    1094 The Largest Generation (25 分)
    1090 Highest Price in Supply Chain (25 分)
    树的遍历
    1086 Tree Traversals Again (25 分)
    1079 Total Sales of Supply Chain (25 分 树
  • 原文地址:https://www.cnblogs.com/KiloNet/p/1528416.html
Copyright © 2011-2022 走看看