MS SQL server - конвертировать строку HEX в целое число

18

Этот ответ на тот же вопрос:

Преобразование целого числа в hex и 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.

    
задан mickeyf 31.08.2010 в 00:08
источник
  • Вы получаете конкретную ошибку или неожиданные результаты? Примеры были бы полезны. –  LittleBobbyTables 31.08.2010 в 00:19
  • Вы видели это? Посмотрите на комментарии ... blog.sqlauthority.com/2010/02/01/... –  Leniel Macaferi 31.08.2010 в 00:34
  • Это один из первых сообщений, которые появились при поиске. Каждый из этих ответов использует пользовательскую функцию, DLL (для крика вслух!) Или предлагает встроенный CONVERT, который до сих пор я не могу использовать. Попытка использовать его, по-видимому, многократно копировалась многими людьми, которые сами не тестировали. –  mickeyf 31.08.2010 в 01:25
  • Я думаю, вам придется использовать UDF для этого: digitalcolony.com/2007/06/... –  Leniel Macaferi 31.08.2010 в 02:14
  • Что означает «не работает»? CONVERT () - это встроенная функция, и крайне маловероятно, что она не работает. Поэтому, пожалуйста, разместите версию и версию MSSQL, а также результаты запуска двух запросов SELECT из ответа, связанного с: SELECT CONVERT (VARBINARY (8), 16777215) и SELECT CONVERT (INT, 0xFFFFFF) –  Pondlife 31.08.2010 в 09:46

1 ответ

31

Спасибо за предоставление более явных примеров. Насколько я могу судить по документации и Google, это невозможно в MSSQL 2005 без UDF или другого процедурного кода. В MSSQL 2008 параметр style функции 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') .

    
ответ дан Pondlife 31.08.2010 в 18:00
  • Спасибо и спасибо, что заставило меня уточнить мой вопрос. Я искал параметры стиля для версии Convert, которые у меня есть, думая, что она может быть там, но пришла в себя. Это был запрос ad-hoc (без приложения), и я надеялся избежать настройки базы данных, добавив UDF. В какой-то момент он может стать частью приложения, и все эти проблемы исчезнут. –  mickeyf 01.09.2010 в 01:07
  • Интересно отметить, что это не работает: select convert (int, convert (varbinary, '0x1', 1)) Но это DOES: select convert (int, convert (varbinary, '0x01', 1)) Для некоторых причина, что начальный нуль ПОСЛЕ 0x имеет значение для одноразрядных строк. –  carl.anderson 13.10.2015 в 21:50
  • @ carl.anderson Это поведение явно документировано: «Выражение должно состоять из четного числа шестнадцатеричных цифр ... Если выражение содержит нечетное число символов ... возникает ошибка». –  Ian Kemp 13.07.2016 в 11:01
  • также работает для меня для получения текстовых символов в Юникоде ...... большая помощь в очистке строковых данных ascii с помощью «\ uNNNN» вместо правильного текста юникода ... т.е. --- select nchar (convert (int, convert ( varbinary, '0x56fd', 1))) –  Mike M 23.02.2017 в 03:25