Ci sono problemi con le due risposte più votate. La risposta che consiglia DATALENGTH
è soggetta a errori del programmatore. Il risultato di DATALENGTH
deve essere diviso per 2 per i NVARCHAR
tipi, ma non per i VARCHAR
tipi. 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') - 1
alle 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
è VARCHAR
o NVARCHAR
. L'esecuzione LEFT
di 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 REPLACE
tecnica e molto più veloce con corde più lunghe. Fondamentalmente questa tecnica è la LEN(@s + 'x') - 1
tecnica, 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.