Ada masalah dengan dua jawaban pilihan teratas. Jawaban yang direkomendasikan DATALENGTHrentan terhadap kesalahan programmer. Hasil dari DATALENGTHharus dibagi 2 untuk NVARCHARtipe, tetapi tidak untuk VARCHARtipe. Ini membutuhkan pengetahuan tentang jenis yang Anda dapatkan panjangnya, dan jika jenis itu berubah, Anda harus rajin mengubah tempat yang Anda gunakan DATALENGTH.
Ada juga masalah dengan jawaban yang paling banyak dipilih (yang saya akui adalah cara yang saya pilih untuk melakukannya sampai masalah ini menggigit saya). Jika hal yang Anda dapatkan panjangnya adalah tipe NVARCHAR(4000), dan itu benar-benar berisi string 4000 karakter, SQL akan mengabaikan karakter yang ditambahkan daripada secara implisit menampilkan hasilnya NVARCHAR(MAX). Hasil akhirnya adalah panjang yang salah. Hal yang sama akan terjadi dengan VARCHAR (8000).
Apa yang saya temukan berfungsi, hampir secepat lama biasa LEN, lebih cepat daripada LEN(@s + 'x') - 1string besar, dan tidak mengasumsikan lebar karakter yang mendasarinya adalah sebagai berikut:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
Ini mendapatkan datalength, dan kemudian membaginya dengan datalength karakter tunggal dari string. Penambahan 'x' mencakup kasus di mana string kosong (yang akan memberikan pembagian dengan nol dalam kasus itu). Ini berfungsi baik @situ VARCHARatau NVARCHAR. Melakukan LEFTof 1 karakter sebelum append memotong beberapa waktu ketika stringnya besar. Masalahnya dengan ini, adalah bahwa itu tidak bekerja dengan benar dengan string yang mengandung pasangan pengganti.
Ada cara lain yang disebutkan dalam komentar untuk jawaban yang diterima, menggunakan REPLACE(@s,' ','x'). Teknik itu memberikan jawaban yang benar, tetapi beberapa kali lipat lebih lambat daripada teknik lain ketika stringnya besar.
Mengingat masalah yang diperkenalkan oleh pasangan pengganti pada teknik apa pun yang digunakan DATALENGTH, menurut saya metode teraman yang memberikan jawaban benar yang saya ketahui adalah sebagai berikut:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
Ini lebih cepat daripada REPLACEtekniknya, dan jauh lebih cepat dengan senar yang lebih panjang. Pada dasarnya teknik ini adalah LEN(@s + 'x') - 1teknik, tetapi dengan perlindungan untuk kasus tepi di mana string memiliki panjang 4000 (untuk nvarchar) atau 8000 (untuk varchar), sehingga jawaban yang benar diberikan bahkan untuk itu. Ini juga harus menangani string dengan pasangan pengganti dengan benar.