En çok oylanan iki cevapla ilgili sorunlar var. Önerilen cevap DATALENGTHprogramcı hatalarına açıktır. Sonuç, türler DATALENGTHiçin 2'ye bölünmelidir NVARCHAR, ancak VARCHARtürler için değil . Bu, uzunluğunu aldığınız tür hakkında bilgi gerektirir ve bu tür değişirse, kullandığınız yerleri özenle değiştirmeniz gerekir.DATALENGTH .
Ayrıca en çok oylanan yanıtla ilgili bir sorun var (kabul ediyorum ki bu sorun beni ısırana kadar bunu yapmak için tercih ettiğim yoldu). Uzunluğunu aldığınız şey NVARCHAR(4000)bir türdeyse ve aslında 4000 karakterlik bir dize içeriyorsa, SQL sonucu örtük olarak atamak yerine eklenen karakteri yok sayacaktır.NVARCHAR(MAX) . Sonuç, yanlış bir uzunluktur. Aynı şey VARCHAR (8000) için de olacak.
Çalışmalar bulduğum şey, neredeyse eski kadar hızlı LEN, LEN(@s + 'x') - 1büyük dizelerden daha hızlı ve temeldeki karakter genişliğinin aşağıdaki gibi olduğunu varsaymıyor:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
Bu, veri uzunluğunu alır ve ardından dizeden tek bir karakterin veri uzunluğuna göre böler. 'X' eki, dizenin boş olduğu durumu kapsar (bu durumda sıfıra bölme verir). Bu ister çalışır @solduğunu VARCHARveya NVARCHAR. YapmakLEFT ekleme parfümünü önce bir süre 1 karakterinin dize büyük olduğunda. Bununla ilgili sorun, vekil çiftler içeren dizelerle düzgün çalışmamasıdır.
Kabul edilen cevaba yapılan bir yorumda belirtilen başka bir yol var REPLACE(@s,' ','x'). Bu teknik doğru cevabı verir, ancak tel büyük olduğunda diğer tekniklerden birkaç kat daha yavaştır.
Vekil çiftler tarafından kullanılan herhangi bir teknikte ortaya çıkan problemler göz önüne alındığında, DATALENGTHbildiğim doğru cevapları veren en güvenli yöntemin şu olduğunu düşünüyorum:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
Bu, REPLACEteknikten daha hızlı ve daha uzun dizelerle çok daha hızlıdır. Temelde bu teknik LEN(@s + 'x') - 1tekniktir, ancak dizinin 4000 (nvarchar için) veya 8000 (varchar için) uzunluğuna sahip olduğu uç durum için koruma sağlar, böylece bunun için bile doğru yanıt verilir. Ayrıca vekil çiftleri olan dizeleri de doğru şekilde işlemelidir.