En çok oylanan iki cevapla ilgili sorunlar var. Önerilen cevap DATALENGTH
programcı hatalarına açıktır. Sonuç, türler DATALENGTH
için 2'ye bölünmelidir NVARCHAR
, ancak VARCHAR
tü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') - 1
bü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 @s
olduğunu VARCHAR
veya 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, DATALENGTH
bildiğim doğru cevapları veren en güvenli yöntemin şu olduğunu düşünüyorum:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
Bu, REPLACE
teknikten daha hızlı ve daha uzun dizelerle çok daha hızlıdır. Temelde bu teknik LEN(@s + 'x') - 1
tekniktir, 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.