2010-08-30 14 views
18

ta odpowiedź, co wygląda na to samo pytanie:serwer MS SQL - konwersja HEX ciąg do liczby całkowitej

Convert integer to hex and hex to integer

..does nie działać dla mnie.

Nie mogę przejść do ciągu HEX do liczby całkowitej za pomocą serwera MS SQL 2005 CAST lub CONVERT. Czy brakuje mi czegoś trywialnego? Mam obszerne wyszukiwanie, a najlepsze, jakie mogę znaleźć, to długie funkcje użytkownika, które przechodzą od wartości ciągu szesnastkowego do czegoś, co wygląda jak liczba dziesiętna. Z pewnością istnieje prosty sposób na zrobienie tego bezpośrednio w zapytaniu za pomocą wbudowanych funkcji, zamiast pisania funkcji użytkownika?

Dzięki

Edycja zawierać przykłady:

wybierz CONVERT (int, 0x89)

działa zgodnie z oczekiwaniami, ale

wybierz CONVERT (INT " 0x '+ substring (msg, 66, 2)) od sometable

dostaje mnie:

"Konwersja nie powiodła się podczas konwertowania wartości varchar '0x89' do danych typu int."

dodatkowy wyraźny CAST:

wybierz CONVERT (INT, CAST ('0x89' AS VARBINARY))

Wykonuje, ale zwraca 813185081.

zastępując 'INT', "Dziesiętny", itp. Dla "Varbinary" powoduje błąd. Ogólnie rzecz biorąc, łańcuchy, które wyglądają na liczbowe, są interpretowane jako liczbowe, jeśli jest to wymagane, ale nie w tym przypadku, i nie wydaje się, że łańcuch CAST rozpoznaje HEX. Chciałbym myśleć, że jest coś prostego i oczywistego, a ja po prostu tęskniłem.

Microsoft SQL Server Management Studio Express 9.00.3042.00

Microsoft SQL Server 2005 - 9.00.3080.00 (Intel X86) 06 wrzesień 2009 01:43:32 Copyright (c) 1988-2005 Microsoft Corporation Express Edition z zaawansowanych usług w systemie Windows NT 5.1 (Build 2600: Service pack 3)

Podsumowując: chcę wziąć ciąg szesnastkowy, który jest wartością w tabeli, a następnie wyświetlić je jako część wyniku kwerendy dziesiętna liczba całkowita, wykorzystująca tylko funkcje zdefiniowane przez system, a nie UDF.

+1

Czy pojawia się określony błąd lub nieoczekiwane wyniki? Przykłady byłyby pomocne. – LittleBobbyTables

+0

Co oznacza "nie działa źle"? CONVERT() jest wbudowaną funkcją i jest bardzo mało prawdopodobne, że nie działa. Więc proszę, opublikuj swoją wersję i edycję MSSQL, a także wyniki uruchamiania dwóch zapytań SELECT z odpowiedzi, do której jesteś podłączony: SELECT CONVERT (VARBINARY (8), 16777215) i SELECT CONVERT (INT, 0xFFFFFF) – Pondlife

+0

Widziałeś to? Zobacz komentarze ... http://blog.sqlauthority.com/2010/02/01/sql-server-question-how-to-convert-hex-to-decimal/ –

Odpowiedz

30

Dziękujemy za przedstawienie bardziej konkretnych przykładów. O ile mogę powiedzieć z dokumentacji i Googling, nie jest to możliwe w MSSQL 2005 bez UDF lub innego kodu proceduralnego.W MSSQL 2008 Funkcja konwersji() za styl parametr teraz supoprts dane binarne, więc można to zrobić bezpośrednio tak:

select convert(int, convert(varbinary, '0x89', 1)) 

w poprzednich wersjach, do wyboru są:

  • Użyj UDF (TSQL lub CLR; w rzeczywistości CLR może być łatwiejsze)
  • Owiń SELECT w procedurze przechowywanej (ale prawdopodobnie nadal będziesz mieć w niej odpowiednik UDF)
  • Konwersja w interfejsie aplikacji
  • Upgrade do MSSQL 2008

Jeśli konwersja danych jest tylko do celów wystawowych, aplikacja może być najprostszym rozwiązaniem: formatowanie danych zwykle należy tam w każdym razie. Jeśli musisz to zrobić w zapytaniu, to UDF jest najłatwiejszy, ale wydajność może nie być duża (wiem, że powiedziałeś, że wolałeś nie używać UDF, ale nie jest jasne dlaczego). Zgaduję, że uaktualnienie do MSSQL 2008 tylko do tego prawdopodobnie nie jest realistyczne.

Wreszcie, FYI numer wersji, którą podałeś, to wersja Management Studio, a nie numer wersji twojego serwera. Aby to uzyskać, zapytaj sam serwer za pomocą select @@version lub select serverproperty('ProductVersion').

+0

Dzięki, i dzięki za wyjaśnienie mi mojego pytania. Szukałem parametrów stylu dla wersji Convert, którą posiadałem, myśląc, że może tam być, ale wymknęło mi się spod kontroli. Było to zapytanie ad-hoc (bez aplikacji) i miałem nadzieję uniknąć podkręcania DB przez dodanie UDF. W pewnym momencie może stać się częścią aplikacji i wszystkie te problemy znikną. – mickeyf

+0

warto zauważyć, że to nie działa: 'select zagospodarowania (int, konwertować (varbinary, '0x1', 1))' Ale to robi: 'wybrać zagospodarowania (int, konwertować (varbinary,„0x01 ', 1)) ' Z jakiegoś powodu początkowe zero PO" 0x "ma znaczenie dla ciągów jednocyfrowych. –

+2

@ carl.anderson [To zachowanie jest jawnie udokumentowane:] (https://msdn.microsoft.com/en-us/library/ms187928.aspx#Anchor_8) "Wyrażenie musi składać się z parzystej liczby cyfr szesnastkowych. .. Jeśli wyrażenie zawiera nieparzystą liczbę znaków ... zostanie zgłoszony błąd. " –

Powiązane problemy