Pergunta

Recentemente eu enfrentei um problema quando usando len() em uma consulta para descobrir o comprimento de uma consulta, len() não estava contando os espaços à direita no valor. Mas datalength() está contando os espaços à direita também.

Será que isso significa que, se eu estou fazendo alguma operação que lida com o comprimento real do valor, então eu tenho que usar dalalength() sobre len().

ex: Se eu precisar o valor de um determinado valor a ser é de 10 comprimento de caracteres. ou seja, se o valor é de 3 comprimento de caracteres Eu tenho de acrescentar 7 espaços para ele.

Foi útil?

Solução

Sim, isso é exatamente o que você deve fazer. Se você quer apenas obter o número de caracteres excluindo espaços em branco que você usaria função LEN(), enquanto em todos os outros casos DATALENGTH().

Mesmo documentação LEN() tem uma informação que, para obter o número de bytes para representar a extensão que você deve usar DATALENGTH()

Aqui estão os links para documentação do MSDN:

LEN ()

DATALENGTH ()

Outras dicas

Tenha cuidado. DATALENGTH devolve o número de bytes utilizado, e não o número de caracteres.

contagem len o número de caracteres não utilizados no armazenamento necessário, este será ainda mais evidente quando você usar nvarchar em vez de varchar

len não conta com espaços a qualquer

dar uma olhada nesta

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


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

e a saída para o len é 3, enquanto a saída para datalength = 10

Apenas uso Substituir ():

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

Isto irá substituir espaços à direita, com um personagem que LEN () vai realmente contar.
O problema com DataLength () é que você tem que manter o controle de wether a cadeia é Unicode (nChar, nVarChar) ou ASCII (Char, VarChar) para saber se você também precisa dividir o datalength de uma seqüência de caracteres Unicode por 2.

Eu estava prestes a usar o Len (Replace ( 'blá blá','', '_') sugestão quando ele me surpreendeu, pode ser mais eficiente para uso. Apenas postar no caso de alguém se depara com esta discussão como eu fiz.

LEN ( 'blá blá' + '') - 1

Infelizmente não há nenhuma solução perfeita que eu estou ciente.

Uma das soluções propostas, LEN(string + '.')-1 retorna resultados errados (-1) se a cadeia é Unicode de tamanho 4000 ou não-Unicode e de tamanho 8000. Isso porque a concatenação é ignorado. Você pode superar isso, se quiser, lançando a string para uma string MAX-size:? LEN(CAST(string as nvarchar(max)) + '.')-1, mas vale a pena

Como mencionado por outros, DATALENGTH(string) retorna o número de bytes usados ??para o armazenamento. Para cadeias de caracteres Unicode, pode não ser suficiente para dividir o resultado por 2: Unicode substituto caracteres pode demorar mais de 16 bits.

Ao todo, estar consciente das limitações de cada abordagem e escolher o que você acha que vai lhe causar menos problemas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top