Es gibt Probleme mit den beiden am besten bewerteten Antworten. Die empfohlene Antwort DATALENGTH
ist anfällig für Programmiererfehler. Das Ergebnis von DATALENGTH
muss für NVARCHAR
Typen durch 2 geteilt werden, nicht jedoch für VARCHAR
Typen. Dies erfordert Kenntnisse über den Typ, dessen Länge Sie erhalten. Wenn sich dieser Typ ändert, müssen Sie die von Ihnen verwendeten Stellen sorgfältig ändern DATALENGTH
.
Es gibt auch ein Problem mit der am besten bewerteten Antwort (was ich zugeben muss, war meine bevorzugte Methode, bis dieses Problem mich gebissen hat). Wenn das Objekt, dessen Länge Sie erhalten, vom Typ NVARCHAR(4000)
ist und tatsächlich eine Zeichenfolge mit 4000 Zeichen enthält, ignoriert SQL das angehängte Zeichen, anstatt das Ergebnis implizit umzuwandeln NVARCHAR(MAX)
. Das Endergebnis ist eine falsche Länge. Das gleiche passiert mit VARCHAR (8000).
Was ich gefunden habe, funktioniert, ist fast so schnell wie normal LEN
, ist schneller als LEN(@s + 'x') - 1
bei großen Zeichenfolgen und geht nicht davon aus, dass die zugrunde liegende Zeichenbreite wie folgt ist:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
Dies erhält die Datenlänge und dividiert dann durch die Datenlänge eines einzelnen Zeichens aus der Zeichenfolge. Der Anhang von 'x' deckt den Fall ab, in dem die Zeichenfolge leer ist (was in diesem Fall eine Division durch Null ergeben würde). Dies funktioniert , ob @s
ist VARCHAR
oder NVARCHAR
. Doing die LEFT
von 1 Zeichen vor dem Anfügen Rasur einige Zeit , wenn die Zeichenfolge groß ist . Das Problem dabei ist jedoch, dass es mit Zeichenfolgen, die Ersatzpaare enthalten, nicht richtig funktioniert.
Es gibt eine andere Möglichkeit, die in einem Kommentar zur akzeptierten Antwort mit erwähnt wird REPLACE(@s,' ','x')
. Diese Technik gibt die richtige Antwort, ist jedoch einige Größenordnungen langsamer als die anderen Techniken, wenn die Zeichenfolge groß ist.
Angesichts der Probleme, die Ersatzpaare bei jeder verwendeten Technik verursachen, DATALENGTH
denke ich, dass die sicherste Methode, die mir die richtigen Antworten gibt, die folgenden ist:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
Dies ist schneller als die REPLACE
Technik und viel schneller bei längeren Saiten. Grundsätzlich ist diese Technik die LEN(@s + 'x') - 1
Technik, aber mit Schutz für den Randfall, in dem die Zeichenfolge eine Länge von 4000 (für nvarchar) oder 8000 (für varchar) hat, so dass auch dafür die richtige Antwort gegeben wird. Es sollte auch Zeichenfolgen mit Ersatzpaaren korrekt behandeln.