SQL Server 2014 Hashbytes einer nvarchar(max) - Ergebnis ist vom Datentyp nvarchar(max)
Mithilfe von SQL Server 2014 ich habe eine Tabelle, die eine nvarchar(max)
Spalte namens [ASCII File]
enthalten kann eine ASCII-text Datei von vielen K. ich dann tun wollen MD5-hashbytes auf diese Datei, und der resultierende hash sollte immer 20 bytes.
Gut, wenn ich eine wählen, von hashbytes('MD5', [ASCII File])
ich bekomme Abfrage wurde mit Fehlern abgeschlossen
Msg 8152, Ebene 16, Status 10, Zeile 4
Zeichenfolgen-oder Binärdaten würden abgeschnitten werden.
Bekomme ich die gleiche Meldung, wenn ich versuche
left(hashbytes('MD5', [ASCII File]), 50)
Bekomme ich die gleiche Meldung, wenn ich versuche
convert(varchar(50), hashbytes('MD5', [ASCII File]))
Wie es scheint, da die Spalte mache ich das hashbytes ist nvarchar(max)
, das Ergebnis der hashbytes Funktion ist auch nvarchar(max)
.
Können Sie mir sagen, wie kann ich das Ergebnis die erwarteten 20 lange und nicht etwas so lange hat es abgeschnitten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, das ist nicht möglich, vor allem, da der Rückgabewert von HASHBYTES ist ein
VARBINARY
. Auch, da Ihre versuche wurden nur SELECT-Anweisungen und nicht um eine INSERT-Anweisung, es gibt keine Möglichkeit für den return-Wert zu erhalten, eine Kürzung Fehler. Das abschneiden der Fehler kommt von der Eingang Wert. Wie bereits im verlinkten MSDN-Seite fürHASHBYTES
(für SQL Server 2012 und 2014):Dass sagt eigentlich alles: die Eingabe ist begrenzt auf 8000 bytes, und die Ausgabe ist eine Feste Anzahl von bytes, basierend auf den angegebenen Algorithmus.
Die aktualisierte Dokumentation für den SQL Server-2016 (die entfernt wurde das 8000-byte-Beschränkung), Staaten:
Führen Sie einen einfachen test:
Gibt:
Wenn Sie übergeben möchten, die in mehr als 8000 bytes in einer hash-Funktion in einer SQL Server-version vor 2016, dann müssen Sie die Verwendung von SQLCLR. Sie können entweder schreiben Sie Ihre eigene Funktion, oder Sie können herunterladen und installieren Sie die Kostenlose version des SQL# SQLCLR-Bibliothek (die ich erstellt), und verwenden Sie die Util_Hash und Util_HashBinary Funktionen:
Gibt:
UPDATE
In dem Fall der Verwendung eines
VARCHAR(MAX)
Spalte oder Variablen, aber mit 8000 oder weniger Zeichen (oder eineNVARCHAR(MAX)
Spalte oder Variablen mit 4000 oder weniger Zeichen), wird es kein Problem und alles funktioniert wie erwartet:Gibt:
HASHBYTES
ist immerVARBINARY(8000)
. Es ist auch nicht möglich, ein abschneiden der Fehler von einer Rückkehr Wert auf eine einfache SELECT-Anweisung. Ein Rückgabewert kann nur eine truncation-Fehler beim einfügen in ein Feld kleiner als der angegebene Wert.In der SQL Server-2016 wir haben nicht mehr das problem der Länge der input-parameter für HASHBYTES Funktion.
HASHBYTES (Transact-SQL)
Wenn Sie versuchen, zu konvertieren, eine große varbinary-oder Bild-Datei, die bereits in sql dann es gibt einige eingebaute Funktionen, die dies tun können (evtl. ab 2014), diese einfache Funktion wird die Arbeit für beide varbinary(max) und ältere Bild-Felder..
dann rufen Sie einfach die Funktion auswählen:
Den Eingang maximale Länge von 8.000 Byte für die HASHBYTES (Transact-SQL) - Funktion entfernt wird, in sql 2016
Basierend auf Algorithmus nachfolgend werden die output-Daten Größe
128 bits (16 bytes), die für MD2, MD4 und MD5;
160 bits (20 bytes) für SHA und die SHA1 -;
256 bits (32 bytes) für SHA2_256
512 bit (64 Byte) für SHA2_512.