Existem problemas com as duas respostas mais votadas. A resposta recomendando DATALENGTHestá sujeita a erros do programador. O resultado de DATALENGTHdeve ser dividido por 2 para NVARCHARtipos, mas não para VARCHARtipos. Isso requer conhecimento do tipo do qual você está obtendo o comprimento e, se esse tipo mudar, você terá que alterar diligentemente os locais que usou DATALENGTH.
Também há um problema com a resposta mais votada (que, admito, era minha maneira preferida de fazer isso até que esse problema me mordesse). Se o que você está obtendo com o comprimento for do tipo NVARCHAR(4000)e, na verdade, contiver uma string de 4.000 caracteres, o SQL irá ignorar o caractere anexado em vez de lançar implicitamente o resultado NVARCHAR(MAX). O resultado final é um comprimento incorreto. O mesmo acontecerá com VARCHAR (8000).
O que eu descobri que funciona, é quase tão rápido quanto o normal LEN, é mais rápido do que LEN(@s + 'x') - 1para strings grandes e não assume que a largura do caractere subjacente seja a seguinte:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
Isso obtém o comprimento de dados e, em seguida, divide pelo comprimento de dados de um único caractere da string. O apêndice de 'x' cobre o caso em que a string está vazia (o que resultaria em uma divisão por zero nesse caso). Isso funciona se @sé VARCHARou NVARCHAR. Fazer o LEFTde 1 caractere antes do acréscimo corta algum tempo quando a string é grande. O problema com isso, porém, é que não funciona corretamente com strings contendo pares substitutos.
Há outra forma mencionada em um comentário para a resposta aceita, usando REPLACE(@s,' ','x'). Essa técnica dá a resposta correta, mas é algumas ordens de magnitude mais lenta do que as outras técnicas quando a corda é grande.
Dados os problemas introduzidos por pares substitutos em qualquer técnica que use DATALENGTH, acho que o método mais seguro que dá respostas corretas que conheço é o seguinte:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
Isso é mais rápido do que a REPLACEtécnica e muito mais rápido com cordas mais longas. Basicamente esta técnica é a LEN(@s + 'x') - 1técnica, mas com proteção para o caso extremo onde a string tem um comprimento de 4000 (para nvarchar) ou 8000 (para varchar), de forma que a resposta correta é dada até mesmo para isso. Ele também deve lidar com strings com pares substitutos corretamente.