web-dev-qa-db-fra.com

Len () vs datalength () dans SQL Server 2005

Récemment, j'ai rencontré un problème lors de l'utilisation de len() dans une requête pour connaître la longueur d'une requête. len() ne comptait pas les espaces de fin dans la valeur. Mais datalength() compte également les espaces de fin.

Cela signifie-t-il que si je fais une opération qui traite de la longueur réelle de la valeur, je dois utiliser dalalength() sur len().

ex: Si j'ai besoin que la valeur d'une valeur particulière soit de 10 caractères. Par exemple, si la valeur est de 3 caractères, je dois lui ajouter 7 espaces.

Cordialement

29
Arun P Johny

Oui c'est exactement ce que vous devez faire. Si vous voulez simplement obtenir le nombre de caractères sans les blancs, utilisez la fonction LEN(), alors que dans tous les autres cas, DATALENGTH().

Même la documentation LEN() contient des informations qui, pour obtenir le nombre d’octets représentant l’extension, doivent utiliser DATALENGTH()

Voici les liens vers les documents MSDN:

LEN ()

DATALENGTH ()

20
RaYell

Faites attention. DATALENGTH renvoie le nombre d'octets utilisés, pas le nombre de caractères.

35
Joe Chung

len compte le nombre de caractères utilisés et non le stockage requis, cela sera encore plus évident si vous utilisez nvarchar au lieu de varchar

len ne compte pas non plus les espaces finaux

regarde ça 

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


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

et la sortie pour len est 3 alors que la sortie pour datalength = 10

11
SQLMenace

J'étais sur le point d'utiliser la suggestion de Len (Remplacer ('bla bla', '', '_') Quand elle m'a frappé, elle est peut-être plus efficace. Utilisez juste au cas où quelqu'un tomberait sur ce fil comme J'ai fait.

len ('bla bla' + '.') - 1

2
Jay Wheeler

Utilisez simplement Remplacer ():

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

Cela remplacera les espaces de fin par un caractère que LEN () comptera réellement.

Le problème avec DataLength () est que vous devez savoir si votre chaîne est Unicode (nChar, nVarChar) ou ASCII (Char, VarChar) pour savoir si vous devez également diviser le fichier. longueur de données d'une chaîne Unicode par 2.

2
MikeTeeVee

Malheureusement, il n’existe pas de solution parfaite à ma connaissance. 

L'une des solutions proposées, LEN(string + '.')-1 renvoie des résultats erronés (-1) si la chaîne est Unicode de taille 4000 ou non Unicode et de taille 8000. En effet, la concaténation est ignorée. Vous pouvez résoudre ce problème si vous le souhaitez en convertissant la chaîne en chaîne de taille MAX: LEN(CAST(string as nvarchar(max)) + '.')-1, mais cela en vaut-il la peine?

Comme mentionné par d’autres, DATALENGTH(string) renvoie le nombre d’octets utilisés pour le stockage. Pour les chaînes Unicode, il peut ne pas être suffisant de diviser le résultat par 2: Caractères de substitution Unicode peut prendre plus de 16 bits. 

Dans l’ensemble, gardez à l’esprit les limites de chaque approche et choisissez ce que vous croyez qui vous causera le moins de problèmes.

0
divega