2010-08-30 9 views
18

Diese Antwort auf ganzzahlige was aussieht wie die gleiche Frage:MS SQL Server - konvertieren HEX String

Convert integer to hex and hex to integer

..does für mich nicht.

Ich bin nicht in der Lage, zu einem Integer mit MS SQL Server 2005 CAST oder CONVERT zu einer Ganzzahl zu gehen. Fehle ich etwas Triviales? Ich habe ausgiebig gesucht, und das Beste, was ich finden kann, sind langatmige Benutzerfunktionen, die von einem hexadezimalen Zeichenfolgenwert zu etwas gehen, das wie ein dezimaler int aussieht. Sicher gibt es eine einfache Möglichkeit, dies direkt in einer Abfrage mit eingebauten Funktionen zu tun, anstatt eine Benutzerfunktion zu schreiben?

Dank

bearbeiten Beispiele umfassen:

select convert (INT, 0x89)

funktioniert wie erwartet, aber

select convert (INT " 0x '+ Teilstring (msg, 66, 2)) von etwas

bringt mich:

"Fehler bei der Konvertierung, wenn der varchar Wert '0x89' in dem Datentyp int zu konvertieren."

eine zusätzliche explizite CAST:

select convert (INT, CAST ('0x89' AS VARBINARY))

ausgeführt wird, liefert aber 813185081.

Substituieren 'Int', 'Dezimal' usw. für 'Varbinary' führt zu einem Fehler. Im Allgemeinen werden Zeichenfolgen, die numerisch erscheinen, bei Bedarf als numerisch interpretiert, in diesem Fall jedoch nicht, und es scheint keine CAST zu geben, die HEX erkennt. Ich würde gerne denken, dass es etwas Einfaches und Offensichtliches gibt, und ich habe es gerade verpasst.

Microsoft SQL Server Management Studio Express 9.00.3042.00

Microsoft SQL Server 2005 - 9.00.3080.00 (Intel X86) 6. September 2009 01.43.32 Copyright (c) 1988-2005 Microsoft Corporation Express Edition mit Advanced Services auf Windows NT 5.1 (Build 2600: Service Pack 3)

Fazit: ich möchte einen hex-String nehmen, die ein Wert in einer Tabelle, und es als Teil eines Abfrageergebnis angezeigt werden als eine Dezimalzahl, die nur systemdefinierte Funktionen verwendet, keine UDF.

+1

Erhalten Sie einen bestimmten Fehler oder unerwartete Ergebnisse? Beispiele wären hilfreich. – LittleBobbyTables

+0

Was bedeutet "funktioniert nicht"? CONVERT() ist eine eingebaute Funktion und es ist extrem unwahrscheinlich, dass es nicht funktioniert. Also posten Sie bitte Ihre MSSQL-Version und -Edition sowie die Ergebnisse der Ausführung der beiden SELECT-Abfragen aus der Antwort, mit der Sie verbunden sind: SELECT CONVERT (VARBINARY (8), 16777215) und SELECT CONVERT (INT, 0xFFFFFF) – Pondlife

+0

Haben Sie das gesehen? Schauen Sie sich die Kommentare ... http://blog.sqlauthority.com/2010/02/01/sql-server-question-how-to-convert-hex-to-decimal/ –

Antwort

30

Vielen Dank für einige explizite Beispiele. Soweit ich das anhand der Dokumentation und des Googelns feststellen kann, ist dies in MSSQL 2005 ohne UDF oder anderen prozeduralen Code nicht möglich.In MSSQL 2008 der Konvertit (jetzt) ​​Stil Parameter der Funktion Binärdaten supoprts, so können Sie es wie folgt direkt tun:

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

In früheren Versionen haben Sie folgende Möglichkeiten:

  • Verwenden Sie ein UDF (TSQL oder CLR; CLR könnte eigentlich einfacher sein)
  • Wrap der SELECT in einer gespeicherten Prozedur (aber Sie werden wahrscheinlich immer noch das Äquivalent einer UDF in es sowieso)
  • Konvertieren Sie es im Front-End der Anwendung
  • Upgrade auf MSSQL 2008

Wenn die Datenkonvertierung für die Anzeige nur ist, kann die Anwendung die einfachste Lösung sein: Daten in der Regel Formatierung es trotzdem gehört. Wenn Sie es in einer Abfrage tun müssen, dann ist ein UDF am einfachsten, aber die Leistung ist vielleicht nicht groß (ich weiß, dass Sie sagten, dass Sie es vorziehen, keine UDF zu verwenden, aber es ist nicht klar, warum). Ich vermute, dass ein Upgrade auf MSSQL 2008 nur für diesen Fall wahrscheinlich nicht realistisch ist.

Zum Schluss noch einmal die Versionsnummer, die Sie im Lieferumfang enthalten haben, ist die Version von Management Studio, nicht die Versionsnummer Ihres Servers. Fragen Sie dazu den Server selbst mit select @@version oder select serverproperty('ProductVersion').

+0

Danke, und danke für die Klärung meiner Frage. Ich suchte nach Style-Parametern für die Version von Convert, die ich habe, weil ich dachte, es könnte da sein, aber ich kam zu kurz. Dies war eine Ad-hoc-Abfrage (keine App), und ich hoffte, die DB nicht durch Hinzufügen einer UDF optimieren zu können. Irgendwann kann es Teil einer App werden und all diese Probleme werden verschwinden. – mickeyf

+0

interessant, dass dies nicht funktioniert: 'select convert (int, konvertieren (varbinary, '0x1', 1))' aber das macht: 'select convert (int, konvertieren (varbinary,‚0x01 ', 1)) ' Aus irgendeinem Grund ist die führende Null nach '0x' wichtig für einzelne Ziffernfolgen. –

+2

@ carl.anderson [Dieses Verhalten ist explizit dokumentiert:] (https://msdn.microsoft.com/en-us/library/ms187928.aspx#Anchor_8) "Der Ausdruck muss aus einer geraden Anzahl von hexadezimalen Ziffern bestehen. .. Wenn der Ausdruck eine ungerade Anzahl von Zeichen enthält ... wird ein Fehler ausgelöst. " –