Подтвердить что ты не робот

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.

4b9b3361

Ответ 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').