Ci sono problemi con le due risposte più votate. La risposta che consiglia DATALENGTHè soggetta a errori del programmatore. Il risultato di DATALENGTHdeve essere diviso per 2 per i NVARCHARtipi, ma non per i VARCHARtipi. Ciò richiede la conoscenza del tipo di cui stai ottenendo la lunghezza e, se quel tipo cambia, devi cambiare diligentemente i luoghi che hai usato DATALENGTH.
C'è anche un problema con la risposta più votata (che ammetto era il mio modo preferito per farlo fino a quando questo problema non mi ha colpito). Se l'oggetto di cui stai ottenendo la lunghezza è di tipo NVARCHAR(4000)e contiene effettivamente una stringa di 4000 caratteri, SQL ignorerà il carattere aggiunto anziché eseguire il cast implicito del risultato NVARCHAR(MAX). Il risultato finale è una lunghezza errata. La stessa cosa accadrà con VARCHAR (8000).
Quello che ho trovato funziona, è veloce quasi quanto il vecchio LEN, è più veloce rispetto LEN(@s + 'x') - 1alle stringhe di grandi dimensioni e non presume che la larghezza del carattere sottostante sia la seguente:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
Questo ottiene la lunghezza dei dati e quindi la divide per la lunghezza dei dati di un singolo carattere dalla stringa. L'appendice di "x" copre il caso in cui la stringa è vuota (che in quel caso darebbe una divisione per zero). Questo funziona se @sè VARCHARo NVARCHAR. L'esecuzione LEFTdi 1 carattere prima dell'appendice riduce il tempo quando la stringa è grande. Il problema con questo però è che non funziona correttamente con stringhe contenenti coppie surrogate.
C'è un altro modo menzionato in un commento alla risposta accettata, usando REPLACE(@s,' ','x'). Questa tecnica fornisce la risposta corretta, ma è un paio di ordini di grandezza più lenta rispetto alle altre tecniche quando la corda è grande.
Dati i problemi introdotti dalle coppie surrogate su qualsiasi tecnica che utilizzi DATALENGTH, penso che il metodo più sicuro che dia risposte corrette che conosco sia il seguente:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
Questo è più veloce della REPLACEtecnica e molto più veloce con corde più lunghe. Fondamentalmente questa tecnica è la LEN(@s + 'x') - 1tecnica, ma con protezione per il caso limite in cui la stringa ha una lunghezza di 4000 (per nvarchar) o 8000 (per varchar), in modo che la risposta corretta sia data anche per questo. Inoltre, dovrebbe gestire correttamente le stringhe con coppie surrogate.