添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

MS SQL Server10进制和16进制之间的互相转换

在MS SQLServer中常常需要用到10进制和16进制之间的互相转换,下面来总结一下。这里会涉及到CONVERT函数:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

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

这个比较简单。可以利用CONVERT函数,如下:

SELECT CONVERT ( VARBINARY , 988 )

-- 返回 0x000003DC

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

按理说,这个和上面一样,也比较简单:

DECLARE @VAR VARBINARY ( 100 )

SELECT @VAR = CONVERT ( VARBINARY , 988 )

SELECT CONVERT ( INT , @VAR )

--返回 988

但是在实际操作过程中,十六进制数常常是以字符串表示的,这个就比较麻烦了。

SELECT CONVERT ( VARBINARY , '0X1' )

-- 返回 0x305831

它只是将字符串的ASCII码返回给十六进制数。所以想要正确转换,必须要用UDF函数。在MS SQL Server2008开始,CONVERT函数对VARBINARY提供了一个参数,用于转换十六进制。下面分别说明:

1.       MS SQL Server2008之前版本

就像刚才说的必须使用UDF函数。

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

2.       MS SQL Server2008及以后版本

CONVERT函数提供了一个style参数:

style值

输出

0(默认值)

l  将 ASCII 字符转换为二进制字节,或者将二进制字节转换为 ASCII 字符。每个字符或字节按照 1:1 进行转换。

l  如果 data_type 为二进制类型,则会在结果左侧添加字符 0x。

1, 2

l  如果 data_type 为二进制类型,则表达式必须为字符表达式。expression 必须由数量为 偶数 的十六进制数字(0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、a、b、c、d、e、f)组成。如果将 style 设置为 1,字符 0x 必须为表达式中的前两个字符。如果表达式中包含的字符数为奇数或者包含任何无效的字符,则会引发错误。

l  如果转换后的表达式长度大于 data_type 长度,则会在右侧截断结果。

l  如果固定长度 data_types 大于转换后的结果,则会在结果右侧添加零。

l  如果 data_type 为字符类型,则表达式必须为二进制表达式。每个二进制字符均转换为两个十六进制字符。如果转换后的表达式长度大于 data_type 长度,则会在右侧截断结果。

l  如果 data_type 为固定大小的字符类型,并且转换后的结果长度小于其 data_type 长度,则会在转换后的表达式右侧添加空格,以使十六进制数字的个数保持为偶数。

l  对于 style 1,将在转换后的结果左侧添加字符 0x;而对于style2,则不添加字符0X。

利用这个参数,我们就可以非常方便地进行转换了:

SELECT CONVERT ( INT , CONVERT ( VARBINARY , '0X' + '12' , 1 ))

-- 返回 18

三、          参考文献

1. http://www.cnblogs.com/gaizai/p/4001016.html

select number16,substring(number16,1,1) a,substring(number16,2,1) b, substring(number16,3,1) c, substring(number16,4,1) d, substring(number16,5,1) e,substring(number16,6,1) f, substring(number16,7,1) g, substring(number16,8,1) h, convert(decimal(10,0),isnull(replace(replace(replace(replace(replace(replace(substring(number16,1,1),'A','10'),'B','11'),'C','12'),'D','13'),'E','14'),'F','15'),0)) * power(16,7) + convert(decimal(10,0),isnull(replace(replace(replace(replace(replace(replace(substring(number16,2,1),'A','10'),'B','11'),'C','12'),'D','13'),'E','14'),'F','15'),0)) * power(16,6) + convert(decimal(10,0),isnull(replace(replace(replace(replace(replace(replace(substring(number16,3,1),'A','10'),'B','11'),'C','12'),'D','13'),'E','14'),'F','15'),0)) * power(16,5) + convert(decimal(10,0),isnull(replace(replace(replace(replace(replace(replace(substring(number16,4,1),'A','10'),'B','11'),'C','12'),'D','13'),'E','14'),'F','15'),0)) * power(16,4) + convert(decimal(10,0),isnull(replace(replace(replace(replace(replace(replace(substring(number16,5,1),'A','10'),'B','11'),'C','12'),'D','13'),'E','14'),'F','15'),0)) * power(16,3) + convert(decimal(10,0),isnull(replace(replace(replace(replace(replace(replace(substring(number16,6,1),'A','10'),'B','11'),'C','12'),'D','13'),'E','14'),'F','15'),0)) * power(16,2) + convert(decimal(10,0),isnull(replace(replace(replace(replace(replace(replace(substring(number16,7,1),'A','10'),'B','11'),'C','12'),'D','13'),'E','14'),'F','15'),0)) * power(16,1) + convert(decimal(10,0),isnull(replace(replace(replace(replace(replace(replace(substring(number16,8,1),'A','10'),'B','11'),'C','12'),'D','13'),'E','14'),'F','15'),0)) * power(16,0) from test_16to10 where len(number16)>6 -- create table test_16to10(number16 varchar(10) not null); --ex: number16 value is:'D95B7D3C'
本文收藏整理在 SQL 中使用 sql 实现进制 转换 ,如: 十进制 十六进制 十六进制 十进制 、整数 转换 成二进制、数字 转换 16进制 的各种方法,一一介绍如下:第一、 十进制 十六进制 DECLARE @binary varbinary(255), @str_return varchar(255) SELECT @binary = CONVERT(varbinary(255),29327795562...
CREATE FUNCTION ten_turn_sixteen(@a BIGINT) --ALTER FUNCTION zzl6_1(@a BIGINT) RETURNS VARCHAR(MAX) BEGIN DECLARE @x INT,@s VARCHAR(MAX) IF @a<16 BEGIN SET @s =CAST(@a AS VARCHAR(MAX)) IF @s='10' BEGIN SET @s='A' IF @s...
CONVERTible(binary [ ( n ) ],expression ) CONVERTible(varbinary [ ( n | max) ],expression ) binary[ (n) ]表示长度为n字节的固定长度二进制数据,其中n是从 1 到 8,000 的值。存储大小为n字节。... BEGIN DECLARE @i int ,@result bigint SELECT @i=0 ,@result= 0,@s =RTRIM( LTRIM(UPPER (REVERSE( @s)))) IF EXISTS(SELECT TOP 1 1 FROM [sys].[objects] WHERE object_id =OBJECT_ID(N'[dbo].[f_NBaseToDecimal]') AND type IN(N'FN', N'IF', N'TF', N'FS', N'FT')) DROP FUNCTION [dbo].[f_NBaseToDecimal] 2021-10-13 YiCong.Zhuang Create N 进制..