К сожалению, не существует идеального решения, о котором я знаю.
Одно из предложенных решений, LEN(string + '.')-1
возвращает неверные результаты (-1), если строка имеет Unicode размера 4000 или не-Unicode и размера 8000. Это происходит потому, что объединение игнорируется. Вы можете преодолеть это, если хотите, приведя строку к строке размера MAX: LEN(CAST(string as nvarchar(max)) + '.')-1
, но стоит ли это того?
Как уже упоминалось, DATALENGTH(string)
возвращает количество байтов, использованных для хранения. Для строк Unicode может быть недостаточно разделить результат на 2: Суррогатные символы Unicode могут занимать более 16 бит.
В общем, помните об ограничениях каждого подхода и выберите то, во что вы верите, вызовет у вас меньше проблем.