Hay problemas con las dos respuestas más votadas. La respuesta recomendada DATALENGTH
es propensa a errores del programador. El resultado de DATALENGTH
debe dividirse por 2 para NVARCHAR
tipos, pero no para VARCHAR
tipos. Esto requiere conocimiento del tipo que está obteniendo, y si ese tipo cambia, debe cambiar diligentemente los lugares que utilizó DATALENGTH
.
También hay un problema con la respuesta más votada (que admito que era mi forma preferida de hacerlo hasta que este problema me mordió). Si lo que obtiene la longitud es de tipo NVARCHAR(4000)
, y en realidad contiene una cadena de 4000 caracteres, SQL ignorará el carácter agregado en lugar de emitir implícitamente el resultado NVARCHAR(MAX)
. El resultado final es una longitud incorrecta. Lo mismo ocurrirá con VARCHAR (8000).
Lo que he encontrado funciona, es casi tan rápido como lo viejo LEN
, es más rápido que LEN(@s + 'x') - 1
para cadenas grandes y no asume que el ancho del carácter subyacente es el siguiente:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
Esto obtiene la longitud de datos y luego se divide por la longitud de datos de un solo carácter de la cadena. El agregado de 'x' cubre el caso donde la cadena está vacía (lo que daría una división por cero en ese caso). Esto funciona si @s
es VARCHAR
o NVARCHAR
. Hacer el LEFT
de 1 carácter antes de agregar se afeita en algún momento cuando la cadena es grande. Sin embargo, el problema con esto es que no funciona correctamente con cadenas que contienen pares suplentes.
Hay otra forma mencionada en un comentario para la respuesta aceptada, usando REPLACE(@s,' ','x')
. Esa técnica da la respuesta correcta, pero es un par de órdenes de magnitud más lenta que las otras técnicas cuando la cuerda es grande.
Dados los problemas introducidos por los pares sustitutos en cualquier técnica que utilice DATALENGTH
, creo que el método más seguro que da respuestas correctas que conozco es el siguiente:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
Esto es más rápido que la REPLACE
técnica y mucho más rápido con cuerdas más largas. Básicamente, esta técnica es la LEN(@s + 'x') - 1
técnica, pero con protección para el caso de borde donde la cadena tiene una longitud de 4000 (para nvarchar) u 8000 (para varchar), de modo que la respuesta correcta se da incluso para eso. También debe manejar correctamente las cadenas con pares sustitutos.