十进制/小数转换为十六进制问题

时间:2018-12-07 00:16:31

标签: sql-server casting type-conversion hex decimal

我的问题与SQL查询中与十进制和十六进制转换有关的一些细节有关。

下面是一些原始代码的示例:

SELECT
    a.COMMUNICATION_PROTOCOL + '_' + CAST(a.ABC_ID1 AS VARCHAR) 
    + '_' + CAST(a.CODE_CNT1 AS VARCHAR) + '_' + CAST(a.ABC_ID2 AS VARCHAR)
    + '_' + CAST(a.CODE_CNT2 AS VARCHAR) + '_' 
    + CASE 
        WHEN a.TEST_1 = 'Completed' THEN 'Y'
        WHEN a.TEST_1 = 'NotCompleted' THEN 'N'
    END 
    + '_'
    + CASE 
        WHEN a.TEST_2 = 'Completed' THEN 'Y'
        WHEN a.TEST_2 = 'NotCompleted' THEN 'N'
    END
FROM
    dbo.All_Tests AS a

该代码旨在返回单字母通信协议标识符和两个字符的小整数标识符,以及是否支持测试。在每个之间插入下划线。因此,示例结果为A_14_10_17_40_Y_N。

问题在于ABC_ID1和ABC_ID2实际上是十六进制,而其他则是varchar或小整数。因此,在上面的示例中,A_14_10_17_40_Y_N应该真正读取A_E_10_11_40_Y_N,因为十进制(14)=十六进制(0x00000E),而十进制(17)=十六进制(0x000011)。输出代码只需要十六进制序列的最后两个字符。

SELECT
    ,CONVERT(VARBINARY(8), a.ABC_ID1)
FROM [...]

在上面的测试中,对小整数十进制ABC_ID1进行了转换,对于十进制(14),输出为0x000E;对于十进制(17),输出为0x0011。不过,我不确定我是否在考虑正确的方法。 IA LEN运算符无济于事,因为在这种情况下,十六进制可以是一个字符(E)或两个字符(11),因此我不确定最佳方法是什么。其次,给定所需的十进制到十六进制转换,是否更适合使用CONVERT将两个字符的十六进制插入代码的字符串中,还是可以使用CAST?

任何想法或指导都将不胜感激。

0 个答案:

没有答案