Il y a des problèmes avec les deux réponses les plus votées. La réponse recommandée DATALENGTHest sujette à des erreurs de programmeur. Le résultat de DATALENGTHdoit être divisé par 2 pour les NVARCHARtypes, mais pas pour les VARCHARtypes. 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') - 1pour 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 @ssoit VARCHARou NVARCHAR. Faire le caractère LEFTde 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 REPLACEtechnique, et beaucoup plus rapide avec des cordes plus longues. Fondamentalement, cette technique est la LEN(@s + 'x') - 1technique, 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.