Il y a des problèmes avec les deux réponses les plus votées. La réponse recommandée DATALENGTH
est sujette à des erreurs de programmeur. Le résultat de DATALENGTH
doit être divisé par 2 pour les NVARCHAR
types, mais pas pour les VARCHAR
types. Cela nécessite la connaissance du type dont vous obtenez la longueur, et si ce type change, vous devez changer avec diligence les endroits que vous avez utilisés DATALENGTH
.
Il y a aussi un problème avec la réponse la plus votée (ce que je reconnais était ma façon préférée de le faire jusqu'à ce que ce problème me mette en cause). Si l'élément dont vous obtenez la longueur est de type NVARCHAR(4000)
et qu'il contient en fait une chaîne de 4 000 caractères, SQL ignorera le caractère ajouté au lieu de convertir implicitement le résultat en NVARCHAR(MAX)
. Le résultat final est une longueur incorrecte. La même chose se produira avec VARCHAR (8000).
Ce que j'ai trouvé fonctionne, est presque aussi rapide que l'ancien LEN
, est plus rapide que LEN(@s + 'x') - 1
pour les grandes chaînes et ne suppose pas que la largeur des caractères sous-jacents est la suivante:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
Cela obtient la longueur de données, puis divise par la longueur de données d'un seul caractère de la chaîne. L'ajout de «x» couvre le cas où la chaîne est vide (ce qui donnerait une division par zéro dans ce cas). Cela fonctionne que ce @s
soit VARCHAR
ou NVARCHAR
. Faire le caractère LEFT
de 1 avant l'ajout réduit le temps lorsque la chaîne est volumineuse. Le problème avec ceci cependant, c'est que cela ne fonctionne pas correctement avec des chaînes contenant des paires de substitution.
Il y a une autre façon mentionnée dans un commentaire à la réponse acceptée, en utilisant REPLACE(@s,' ','x')
. Cette technique donne la bonne réponse, mais est de quelques ordres de grandeur plus lente que les autres techniques lorsque la chaîne est grande.
Compte tenu des problèmes introduits par les paires de substitution sur toute technique qui utilise DATALENGTH
, je pense que la méthode la plus sûre qui donne des réponses correctes que je connaisse est la suivante:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
C'est plus rapide que la REPLACE
technique, et beaucoup plus rapide avec des cordes plus longues. Fondamentalement, cette technique est la LEN(@s + 'x') - 1
technique, mais avec une protection pour le cas de bord où la chaîne a une longueur de 4000 (pour nvarchar) ou 8000 (pour varchar), de sorte que la bonne réponse est donnée même pour cela. Il doit également gérer correctement les chaînes avec des paires de substitution.