我的问题与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?
任何想法或指导都将不胜感激。