Есть проблемы с двумя ответами, получившими наибольшее количество голосов. Рекомендуемый ответ DATALENGTH
подвержен ошибкам программиста. Результат DATALENGTH
должен быть разделен на 2 для NVARCHAR
типов, но не для VARCHAR
типов. Это требует знания типа, длина которого вы получаете, и если этот тип изменится, вам придется старательно менять места, которые вы использовали DATALENGTH
.
Также существует проблема с ответом, получившим наибольшее количество голосов (который, я признаю, был моим предпочтительным способом сделать это, пока эта проблема не укусила меня). Если объект, который вы получаете длину, относится к типу NVARCHAR(4000)
и фактически содержит строку из 4000 символов, SQL будет игнорировать добавленный символ, а не неявно приводить результат к NVARCHAR(MAX)
. Конечный результат - неправильная длина. То же самое произойдет с VARCHAR (8000).
То, что я обнаружил, работает, почти так же быстро, как и обычное старое LEN
, быстрее, чем LEN(@s + 'x') - 1
для больших строк, и не предполагает, что ширина основного символа следующая:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
Он получает длину данных, а затем делит ее на длину одного символа из строки. Добавление «x» охватывает случай, когда строка пуста (что в этом случае дает деление на ноль). Это работает независимо от того, @s
есть ли VARCHAR
или NVARCHAR
. Выполнение LEFT
1 символа перед добавлением сбрит некоторое время, когда строка большая. Однако проблема заключается в том, что он некорректно работает со строками, содержащими суррогатные пары.
В комментарии к принятому ответу упоминается еще один способ, используя REPLACE(@s,' ','x')
. Этот метод дает правильный ответ, но на пару порядков медленнее, чем другие методы, когда струна большая.
Учитывая проблемы, возникающие при использовании суррогатных пар при использовании любого метода DATALENGTH
, я считаю, что самый безопасный метод, который дает правильные ответы, о которых я знаю, это следующий:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
Это быстрее, чем REPLACE
техника, и намного быстрее с более длинными струнами. По сути, это техника LEN(@s + 'x') - 1
, но с защитой для крайнего случая, когда строка имеет длину 4000 (для nvarchar) или 8000 (для varchar), так что даже для этого дается правильный ответ. Он также должен правильно обрабатывать строки с суррогатными парами.