• SQLSERVER 16进制与10进制转换


    最近工控项目中遇到的16进制与10进制转换,在.NET中比较容易实现,在SQLSERVER中发现没有直接的转换,尤其是出现超出范围的long负数,即无符号64位整数在sqlserver中的存储。网上找的很多方法只适用于32位整数和64位正整数,64位负数无法实现,现将使用的转换方法记录下来。

    利用SQLSERVER中的varbinary来间接实现。

    16进制字符串转10进制bigint(0-FFFFFFFFFFFFFFFF):

    由于二进制比较容易转换为bigint 所以先将字符串转为二进制varbinary,再转换为10进制

    CREATE  function [dbo].[hextoint](@s varchar(16)) 
    returns bigint  
    begin 
     declare @result bigint
     set @result=CONVERT(bigint, CONVERT(varbinary, CAST(N'0x' + @s AS char), 1))--最简单有效的方法
     return @result
    END
    
    GO

    10进制转16进制字符串(bigint正负数都可以):相同的思路目前可以将二进制varbinary转换为字符串比较容易,那么先将10进制转二进制再进行16进制字符串输出

    CREATE   function [dbo].[inttohex](@num bigint) 
    returns varchar(16)  
    begin 
    declare @num2 varbinary(8),@r varchar(50)
    set @num2=convert(varbinary(8),@num)--直接转换为二进制
    set @r= dbo.varbin2hexstr(@num2)--二进制转16进制字符串
    return @r 
    end 
    
    GO
     CREATE function [dbo].[varbin2hexstr](
        @bin varbinary(8000)
        )returns varchar(8000)
        as
        begin
            declare @re varchar(8000),@i int
            select @re='',@i=datalength(@bin)
            while @i>0
                select @re=substring('0123456789ABCDEF',substring(@bin,@i,1)/16+1,1)
                        +substring('0123456789ABCDEF',substring(@bin,@i,1)%16+1,1)
                        +@re
                    ,@i=@i-1
           -- return('0x'+@re)
            return @re
        end
        
    
    GO

    以上代码测试环境WIN2003+SQLSERVER2008

  • 相关阅读:
    SQL server 数据库基础语句
    数据库学习的第一天
    C# 函数
    C# for循环的嵌套 作用域
    C# for循环语句
    Docker的基本使用
    django连接postgresql
    docker的安装
    Postgresql的使用
    Celery的介绍
  • 原文地址:https://www.cnblogs.com/merray/p/3507130.html
Copyright © 2020-2023  润新知