MS SQL server - преобразовать строку HEX в целое число
Этот ответ на тот же вопрос:
Преобразовать целое число в шестнадцатеричное и шестнадцатеричное целое
.. не работает для меня.
Я не могу перейти к строке HEX к целому числу, используя MS SQL server 2005 CAST или CONVERT. Я пропустил что-то тривиальное? Я искал экстенсивно, и лучшее, что я могу найти, - это длинные пользовательские функции, чтобы перейти от значения шестнадцатеричной строки к тому, что выглядит как десятичный int. Конечно, есть простой способ сделать это непосредственно в запросе, используя встроенные функции, а не писать пользовательскую функцию?
Спасибо
Изменить, чтобы включить примеры:
выберите CONVERT (INT, 0x89)
работает как ожидалось, но
выберите CONVERT (INT, '0x' + substring (msg, 66, 2)) из sometable
получает меня:
"Ошибка конверсии при преобразовании значения varchar '0x89' в тип данных int."
дополнительный явный CAST:
выберите CONVERT (INT, CAST ('0x89' AS VARBINARY))
выполняется, но возвращает 813185081.
Подстановка "Int", "Decimal" и т.д. для "Varbinary" приводит к ошибке. В общем случае строки, которые кажутся числовыми, интерпретируются как числовые, если это необходимо, но не в этом случае, и, похоже, CAST не распознает HEX. Я хотел бы думать, что есть что-то простое и очевидное, и я просто пропустил его.
Microsoft SQL Server Management Studio Express 9.00.3042.00
Microsoft SQL Server 2005 - 9.00.3080.00 (Intel X86) 6 сентября 2009 г. 01:43:32 Copyright (c) 1988-2005 Microsoft Corporation Express Edition с расширенными службами в Windows NT 5.1 (сборка 2600: с пакетом обновления 3)
Подводя итог: хочу взять шестнадцатеричную строку, которая является значением в таблице, и отображать ее как часть результата запроса как десятичное целое, используя только определенные системой функции, а не UDF.
Ответы
Ответ 1
Спасибо за предоставление более явных примеров. Насколько я могу судить по документации и Google, это невозможно в MSSQL 2005 без UDF или другого процедурного кода. В MSSQL 2008 параметр стиля функции CONVERT() теперь свертывает двоичные данные, поэтому вы можете сделать это прямо следующим образом:
select convert(int, convert(varbinary, '0x89', 1))
В предыдущих версиях ваш выбор:
- Использовать UDF (TSQL или CLR; CLR может быть проще для этого)
- Оберните SELECT в хранимой процедуре (но в любом случае вы все равно будете иметь эквивалент UDF)
- Преобразовать его в интерфейсе приложения
- Переход на MSSQL 2008
Если преобразование данных предназначено только для показа, приложение может быть самым простым решением: форматирование данных обычно в любом случае принадлежит. Если вы должны сделать это в запросе, то UDF будет проще всего, но производительность может быть невелика (я знаю, вы сказали, что предпочитаете не использовать UDF, но это не понятно почему). Я предполагаю, что обновление до MSSQL 2008 только для этого, вероятно, нереально.
Наконец, FYI номер версии, который вы включили, - это версия Management Studio, а не номер версии вашего сервера. Чтобы получить это, запросите сам сервер с помощью select @@version
или select serverproperty('ProductVersion')
.