当前位置: > 数据库 > SQL Server 2005 >

SQL Server Analysis Services无法启动

时间:2015-10-10 15:54来源:linux.it.net.cn 作者:IT

在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

 

 

(责任编辑:IT)
------分隔线----------------------------