Frage

Ich bin mit SQL Server 2000 auf einige Werte aus einer Tabelle auszudrucken mit PRINT. Bei den meisten Nicht-String-Daten, kann ich werfen können nvarchar es drucken, aber binäre Werte versuchen, mit der Bit-Darstellung von Zeichen zu konvertieren. Zum Beispiel:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)

Erwartet:

  

0x12345678

Stattdessen druckt zwei Kauderwelsch Zeichen.

Wie kann ich den Wert von binären Daten drucken? Gibt es einen eingebauten oder muss ich meine eigene Rolle?

Update: Dies ist nicht der einzige Wert auf der Linie, so kann ich nicht nur PRINT @binvalue. Es ist etwas mehr wie PRINT N'other Sachen‘+ ???? + N'more Sachen‘. Nicht sicher, ob das einen Unterschied macht. Ich habe nicht nur versuchen, DRUCK @binvalue von selbst

War es hilfreich?

Lösung

Wenn Sie auf SQL Server 2005 waren Sie diese verwenden:

print master.sys.fn_varbintohexstr(@binvalue)

Ich glaube nicht, dass auf 2000 existiert, obwohl, so müssen Sie vielleicht Ihre eigene Rolle.

Andere Tipps

  

Verwenden Sie master.sys.fn_varbintohexstr nicht -. Es ist schrecklich langsam , ohne Papiere, ohne Unterstützung, und könnten in einer zukünftigen Version von SQL Server gehen weg

Wenn Sie binary(16) konvertieren char, Verwendung convert hex:

convert(char(34), @binvalue, 1)

Warum 34? weil 16*2 + 2 = 34, ist, dass "0x." - 2 Symbole, plus 2 Symbole für jedes Zeichen

Wir haben versucht, zwei Abfragen auf einem Tisch zu machen mit 200000 Zeilen:

  1. select master.sys.fn_varbintohexstr(field)
    from table`
    
  2. select convert(char(34), field, 1)
    from table`
    

Die erste läuft 2 Minuten, während der zweite ein - 4 Sek.

select convert(varchar(max), field , 1) 
from table

Mit dem using varchar(max) Sie sich nicht um die Angabe der Größe kümmern (Art).

Antwort hinzufügen, die ein anderes Beispiel zeigt, die Umwandlung von binär Daten in einen Hex-String, und wieder zurück.

ich will den höchsten Wert timestamp in varchar konvertieren:

SELECT 
   CONVERT(
      varchar(50), 
      CAST(MAX(timestamp) AS varbinary(8)), 
      1) AS LastTS
FROM Users

Welche zurück:

LastTS
==================
0x000000000086862C

Hinweis : Es ist wichtig, dass Sie CONVERT varbinary -> varchar konvertieren verwenden. Mit CAST wird nicht funktionieren:

SELECT 
   CAST(
      CAST(MAX(timestamp) AS varbinary(8)) 
      AS varchar(50) ) AS LastTS
FROM Users

werden die Binärdaten als Zeichen anstatt Hex-Werte, Rückkehr eine leere Zeichenfolge behandeln.

Umkehr es

das gespeicherte Hex-String konvertieren zurück zu einem Zeitstempel:

SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)
  

Hinweis : Jeder Code wird in die Public Domain freigegeben. Keine Zuordnung erforderlich.

DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue 
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)

Sie werfen nicht.

Casting wandelt die binäre durch Wert auf der entsprechenden Sortierungs in Text für die spezifische Datenbank zu setzen.

[Begin Bearbeiten] Wenn Sie den aufgedruckten Wert in einem String-Variablen müssen von Eric Z Beard vorgeschlagen, um die Funktion verwenden.

DECLARE @mybin1 binary(16)
DECLARE @s varchar(100)
SET @mybin1 = 0x098F6BCD4621D373CADE4E832627B4F6
SET @s = 'The value of @mybin1 is: ' + sys.fn_varbintohexsubstring(0, @mybin1,1,0)
PRINT @s

Wenn diese Funktion steht Ihnen zur Verfügung nicht aufgrund von Server-Versionen oder weil es spezielle Berechtigungen benötigt, können Sie Ihre eigene Funktion erstellen.

Um zu sehen, wie diese Funktion in SQL Server 2005 Express Edition implementiert können Sie ausführen:

sp_helptext 'fn_varbintohexsubstring'

ich auf diese Frage kam, während eine Lösung für ein ähnliches Problem betrachtet, während die von der ‚hashbytes‘ Funktion in SQL Server 2005 zurückgegeben Hexwert Druck.

Leider in dieser Version von SQL Server, CONVERT scheint nicht überhaupt zu arbeiten, nur fn_varbintohexsubstring tut die richtige Sache:

Ich habe:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT 'cast(@binvalue AS nvarchar): ' + CAST(@binvalue AS nvarchar)
PRINT 'convert(varchar(max), @binvalue, 0): ' + CONVERT(varchar(max), @binvalue, 0)
PRINT 'convert(varchar(max), @binvalue, 1): ' + CONVERT(varchar(max), @binvalue, 1)
PRINT 'convert(varchar(max), @binvalue, 2): ' + CONVERT(varchar(max), @binvalue, 2)
print 'master.sys.fn_varbintohexstr(@binvalue): ' + master.sys.fn_varbintohexstr(@binvalue)

Hier ist das Ergebnis, das ich in SQL Server 2005 bekam (

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 4Vx
convert(varchar(max), @binvalue, 2): 4Vx
master.sys.fn_varbintohexstr(@binvalue): 0x12345678

(es gibt tatsächlich ein nicht druckbare Zeichen vor dem ‚4Vx den - ich würde ein Bild posten, aber ich habe nicht genug Punkte noch) nicht.


Bearbeiten : Nur hinzufügen - auf SQL Server 2008 R2 das Problem mit CONVERT wird mit der folgenden Ausgabe festgelegt:

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 0x12345678
convert(varchar(max), @binvalue, 2): 12345678
master.sys.fn_varbintohexstr(@binvalue): 0x12345678
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top