Мой вопрос касается некоторых деталей, связанных с десятичным и шестнадцатеричным преобразованием в рамках 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, потому что Decimal (14) = шестнадцатеричный (0x00000E), а Decimal (17) = шестнадцатеричный (0x000011).Для выходного кода нужны только два последних символа в шестнадцатеричной последовательности.
SELECT
,CONVERT(VARBINARY(8), a.ABC_ID1)
FROM [...]
В приведенном выше тесте десятичное целое с малым целым числом ABC_ID1 преобразуется и выводится как 0x000E для десятичной дроби (14) и 0x0011 дляДесятичное число (17).Я не уверен, что думаю об этом правильно.Оператор IA LEN не помог бы, так как шестнадцатеричный в этом случае может быть либо одним символом (E), либо двумя символами (11), поэтому я не уверен, что лучший подход.Во-вторых, с учетом необходимого преобразования десятичного числа в шестнадцатеричное, более ли уместнее использовать CONVERT для вставки двухзначных шестнадцатеричных символов в строку символов кода или можно использовать CAST?
Буду признателен за любые мысли или указания.