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 进制..