Pregunta

Recientemente me enfrentaba a un problema cuando se utiliza len() en una consulta para averiguar la longitud de una consulta, len() no estaba contando los espacios finales en el valor. Pero datalength() está contando los espacios finales también.

¿Tiene que esto significa que si yo estoy haciendo una operación que trata de la longitud real del valor entonces tengo que usar dalalength() sobre len().

Ejemplo: Si necesito el valor de un valor particular a ser es de 10 caracteres de longitud. es decir, si el valor es de 3 caracteres de longitud tengo que añadir 7 espacios para ello.

¿Fue útil?

Solución

Si eso es exactamente lo que debe hacer. Si desea obtener sólo el número de caracteres sin incluir espacios en blanco que usaría la función LEN(), mientras que en los demás casos DATALENGTH().

A pesar de la documentación LEN() tiene una información que para obtener el número de bytes para representar la extensión que debe utilizar DATALENGTH()

Aquí están los enlaces a documentos de MSDN:

LEN ()

DATALENGTH ()

Otros consejos

Tenga cuidado. DATALENGTH devuelve el número de bytes usados, y no el número de caracteres.

len cuenta el número de caracteres que se utilizan no es el almacenamiento requerido, esto será aún más evidente cuando se utiliza nvarchar en lugar de varchar

len no cuenta espacios finales o bien

echar un vistazo a este

declare @v nchar(5)
select @v ='ABC  '


select len(@v),datalength(@v)

y la salida para len es 3, mientras que la salida para datalength = 10

Sólo tiene que utilizar Reemplazar ():

SELECT LEN(REPLACE(N'4 Trailing Spaces:    ', ' ', '_'))

Esto reemplazará los espacios finales con un personaje que LEN () realmente contar.
El problema con una longitud de datos () es que hay que seguir la pista de carnero su cadena es Unicode (nChar, nVarChar) o ASCII (CHAR, VARCHAR) para saber si también es necesario dividir la longitud de datos de una cadena Unicode por 2.

I estaba a punto de utilizar el Len (Reemplazar ( 'bla','', '_') sugerencia cuando se me ocurrió que puede ser más eficaz utilizar. La simple publicación en caso de que alguien se topa con este tema como lo hice.

len ( 'bla' + '') - 1

Desafortunadamente no existe una solución perfecta que yo sepa.

Una de las soluciones propuestas, LEN(string + '.')-1 devuelve resultados incorrectos (-1) si la cadena es Unicode de tamaño 4000 o no Unicode y de tamaño 8000. Eso se debe a que la concatenación se ignora. Usted puede superar esto si quieres, echando la cadena para una cadena MAX-size:? LEN(CAST(string as nvarchar(max)) + '.')-1, pero ¿merece la pena

Como se ha mencionado por otros, DATALENGTH(string) devuelve el número de bytes utilizados para el almacenamiento. Para las cadenas Unicode, puede que no sea suficiente para dividir el resultado por 2: caracteres Unicode sustitutas puede tomar más de 16 bits.

Con todo, ser conscientes de las limitaciones de cada enfoque y elegir lo que usted cree que le hará menos problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top