一、背景

  前段时间群里的朋友问了一个问题:“在查询时增加一个递增序列,如:0x00000001,即每一个都是36进位(0—9,A--Z),0x0000000Z后面将是0x00000010,生成一个像下面的映射表“:

(Figure1:效果图)

二、十进制转换为十六进制

在网上有很多资料关于使用SQL语句把十进制转换为十六进制的资料,比如:

--方式1
SELECT CONVERT(VARBINARY(50), 23785)

  执行返回值为0x00005CE9,但是需要注意的是,这本应该返回二进制的,但是二进制估计是阅读起来太麻烦,所以SQL Server 返回了十六进制,如果你想要保存为字符串并不是简单把这直接使用CONVERT,类似下面的SQL是不会有返回值的:

SELECT CONVERT(VARCHAR,CONVERT(VARBINARY(50), 23785))

所以网上出现了如下的函数来转换为十六进制的字符串:

--方式2
CREATE FUNCTION Binary2HexStr(@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)
END
GO --测试
SELECT dbo.Binary2HexStr(23785)

  上面的SQL同样返回0x00005CE9,但是这次返回的是字符串了,貌似问题都得以解决了,但是,只要你INT值不超过2147483648,这个问题就会出现了,执行下面的SQL返回的结果如Figure2所示:

SELECT dbo.Binary2HexStr(2147483647)
SELECT dbo.Binary2HexStr(2147483648)

(Figure2:数据对比)

从进制的转换运算出发,改进了宋沄剑写了的SQL脚本,修改参数为BIGINT类型:

--方式3
CREATE FUNCTION BigInt2HexStr(@value BIGINT)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @seq CHAR(16)
DECLARE @result VARCHAR(50)
DECLARE @digit CHAR(1) SET @seq = '0123456789ABCDEF'
--求十进制的@value除以的余数,找到余数对应十六进制的值
SET @result = SUBSTRING(@seq, (@value%16)+1, 1) WHILE @value > 0
BEGIN
SET @digit = SUBSTRING(@seq, ((@value/16)%16)+1, 1)
SET @value = @value/16
IF @value <> 0
SET @result = @digit + @result
END RETURN @result
END
GO --测试
SELECT dbo.BigInt2HexStr(2147483647)
SELECT dbo.BigInt2HexStr(2147483648)

执行上面的SQL,返回的十六进制如Figure3所示:

(Figure3:数据对比)

  要想理解上面的函数,你需要理解十进制转换为十六进制的运算规则,假如十进制数23785转为十六进制,计算的公式的步骤为:

  1. 23785/16=1486余9,十进制的9对应十六进制的9
  2. 1486/16=92余14,十进制的14对应十六进制的E
  3. 92/16=5余12,十进制的12对应十六进制的C
  4. 5/16=0余5,十进制的5对应十六进制的5

将余数对应的十六进制倒写,即5CE9,所以十进制23785 = 十六进制0x5CE9

三、十进制转换为三十六进制

  通过上面的例子修改下就能支持十进制到三十六进制的转换了:

--十进制转换为十六进制
CREATE FUNCTION BigIntTo36HexStr(@value BIGINT)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @seq CHAR(36)
DECLARE @result VARCHAR(50)
DECLARE @digit CHAR(1) SET @seq = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
SET @result = SUBSTRING(@seq, (@value%36)+1, 1) WHILE @value > 0
BEGIN
SET @digit = SUBSTRING(@seq, ((@value/36)%36)+1, 1)
SET @value = @value/36
IF @value <> 0
SET @result = @digit + @result
END RETURN @result
END
GO --测试
SELECT dbo.BigIntTo36HexStr(35)

执行上面的测试SQL,返回0xZ,测试成功;

四、补充说明

  其实编写Binary2HexStr函数是没有必要的,因为SQL Server提供系统的函数支持转换master.dbo.fn_varbintohexstr或者master.dbo.fn_varbintohexsubstring,例如:

SELECT master.dbo.fn_varbintohexstr(2147483647)
SELECT master.dbo.fn_varbintohexsubstring(1,2147483647,1,0)

不过他们一样存在对十进制数据的转换不能超过2147483648的限制。

五、参考文献

SqlServer中varbinary转换成字符串

关于递增序列的问题

进制转换

SQL之36进制转换成10进制数据

SQL Server 中,实现 varbinary 与 varchar 类型之间的数据转换

SQL Server: convert varbinary to varchar

SQL Server 进制转换函数的更多相关文章

  1. php进制转换函数

    1 十进制(decimal system)转换函数 ① 十进制转二进制 string  decbin(int number). 参数为一个十进制整型数字,不是整型数字会自动转为整型数字,如'3'转为3 ...

  2. 写一个比较全的进制转换函数--ic

    //写一个比较全的进制转换函数-----未完成 #include <stdio.h> //D进制转换后 (比如10-2进制) 结果可能会很大 需要很长的字符串来存 #include < ...

  3. Python中进制转换函数的使用

    Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...

  4. C++中的各种进制转换函数汇总

    C++中的各种进制转换函数汇总 1.在C中,按指定进制格式输出如下: #include <iostream> #include <cstdio> using namespace ...

  5. SQL Server进制

    在项目中,大家可能都遇到过,需要把十进制转换为其他进制的情况,google上一搜,已经有很多2进制.8进制.16进制和十进制的转换方法.但是在一些项目中,这些可能无法满足要求,可能需要17.18甚至是 ...

  6. Python内置进制转换函数(实现16进制和ASCII转换)

    在进行wireshark抓包时你会发现底端窗口报文内容左边是十六进制数字,右边是每两个十六进制转换的ASCII字符,这里使用Python代码实现一个十六进制和ASCII的转换方法. hex() 转换一 ...

  7. C++中的各种进制转换函数汇总及学习

    一.指定格式输出 1.C中指定格式输出 printf(); //按八进制格式输出,保留5位高位补零 printf(); //按十进制格式输出,保留3位高位补零 printf(); //按十六进制格式输 ...

  8. chr()//ord() //进制转换函数//eval()//文件函数//split()

    1.chr() 函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 用法:chr(i) i可以是10进制也可以是16进制的形式的数字. 2.or ...

  9. c++ 进制转换函数

    转自:https://blog.csdn.net/wangjunchengno2/article/details/78690248 strtol 函数: 它的功能是将一个任意1-36进制数转化为10进 ...

随机推荐

  1. SQL Server 大数据搬迁之文件组备份还原实战

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...

  2. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  3. SQL Server-聚焦APPLY运算符(二十七)

    前言 其实有些新的特性在SQL Server早就已经出现过,但是若非系统的去学习数据库你会发现在实际项目中别人的SQL其实是比较复杂的,其实利用新的SQL Server语法会更加方便和简洁,从本节开始 ...

  4. SignalR系列目录

    [置顶]用SignalR 2.0开发客服系统[系列1:实现群发通讯] [置顶]用SignalR 2.0开发客服系统[系列2:实现聊天室] [置顶]用SignalR 2.0开发客服系统[系列3:实现点对 ...

  5. MVC还是MVVM?或许VMVC更适合WinForm客户端

    最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』.相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的 ...

  6. BPM生产安全管理解决方案分享

    一.方案概述生产安全管理是企业生产管理的重要组成部分,组织实施好企业安全管理规划.指导.检查和决策,保证生产处于最佳安全状态是安全管理的重要内容和职责.H3 BPM企业生产安全管理解决方案是一套专门为 ...

  7. Android—应用程序开机自启

    android开机时候会发送开机广播,我们想要收到广播知道手机开机,才能启动我们的应用程序. 首先要在配置文件中添加相应权限: <uses-permission android:name=&qu ...

  8. 电脑新建svn仓库

    步骤1:安转svg: 注意事项: 安装的时候选择:Modify 安装到以下图片的步骤时: 黄色区域选择: 步骤2:新建svn仓库文件夹(本教程例子:D:\svn-5gpos),选择文件夹右键,点击下图 ...

  9. caffe的python接口学习(7):绘制loss和accuracy曲线

    使用python接口来运行caffe程序,主要的原因是python非常容易可视化.所以不推荐大家在命令行下面运行python程序.如果非要在命令行下面运行,还不如直接用 c++算了. 推荐使用jupy ...

  10. EChart系列:在echart3中使用百度地图扩展之后,如何获取到百度地图对象

    最近做项目想要在百度地图上叠加显示echart的散点图,然后根据地图的缩放等级和区域范围要显示不同的散点图,这中间折腾了好久.功能要求包括: (1)底图使用百度地图: (2)可以在地图上叠加显示ech ...