2017-08-06 1 views
0

Das folgende Skript wird folgende Fehlermeldung gibt: "Msg 8152, Ebene 16, Status 10, Zeile 10 String oder Binärdaten würden abgeschnitten"HASHBYTES funktionieren

select convert(varbinary(max),HASHBYTES('md2',(select [Secteur] 
    ,[Hub] 
    ,[Group] 
    ,[Enterprise] 
    ,[Manager] 
    ,[BM] 
    from [Hubs] for XML auto))) 

Ich erwähne, dass die maximale Länge der Eingabezeilen 123 Bytes ist.

Irgendwelche Ideen, warum diese Nachricht? (Ich benutze SQL Server 2014) Vielen Dank

+0

offizielle Dokumentation sagt, Wert maximale Rendite zu berechnen ist 'varbinary (maximal 8000 Bytes)' – TheGameiswar

+0

oder mehr einschlägig es sagt auch "Für SQL Server 2014 und früher sind zulässige Eingabewerte auf 8000 Bytes begrenzt." –

+0

Sie haben weder ein 'ORDER BY' noch ein' WHERE' in Ihrer Anfrage. Das bedeutet, dass Sie die gesamte Tabelle in XML konvertieren, wobei die Reihenfolge der Zeilen nicht deterministisch ist. Das ist wahrscheinlich nicht das, was Sie als Eingabe für einen Hash wünschen. Wenn Sie lediglich einen Mechanismus benötigen, um zu erkennen, ob sich die Daten geändert haben und Sie nicht mit einem MD2-Hash über XML verheiratet sind, sollten Sie 'CHECKSUM_AGG' verwenden. –

Antwort

1

HASHBYTES ist begrenzt auf 8000 Zeichen Eingabe in SQL 2014 und älter. Es ist nicht in SQL 2016+ beschränkt. Ich vermute, dass Ihre Abfrage bei der Konvertierung in XML mehr als 8000 Byte umfasst.

Sie können den undokumentierten fn_repl_hash_binary verwenden, um einen MD5-Hash (aber kein MD2) in SQL 2014 für lange Eingabedaten zu erhalten, aber ich empfehle es nicht. Es ist nicht nur undokumentiert, es funktioniert überhaupt nicht in Azure SQL.

Ich glaube, Sie müssen eine CLR-Funktion verwenden, um eine MD2 von großen binären Daten in SQL 2014

Verwandte Themen