Існують проблеми з двома голосовими відповідями. Відповідь, яка рекомендує DATALENGTH
, схильна до помилок програміста. Результат DATALENGTH
повинен бути розділений на 2 для NVARCHAR
типів, але не для VARCHAR
типів. Для цього потрібні знання про тип, який ви отримуєте, і якщо цей тип зміниться, вам потрібно старанно змінити місця, які ви використовували DATALENGTH
.
Існує також проблема з найбільш схваленою відповіддю (яка, я визнаю, був моїм кращим способом зробити це, поки ця проблема не вкусила мене). Якщо річ, для якої ви отримуєте довжину, має тип NVARCHAR(4000)
, і вона фактично містить рядок з 4000 символів, SQL буде ігнорувати доданий символ, а не неявно віддавати результат NVARCHAR(MAX)
. Кінцевий результат - неправильна довжина. Те саме відбудеться і з VARCHAR (8000).
Те, що я знайшов, працює майже так само швидко, як і звичайне старе LEN
, швидше, ніж LEN(@s + 'x') - 1
для великих рядків, і не передбачає, що основна ширина символів полягає в наступному:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
Це отримує довжину даних, а потім ділиться на довжину даних одного символу з рядка. Додаток 'x' охоплює випадок, коли рядок порожній (що в цьому випадку дасть ділення на нуль). Це працює @s
це VARCHAR
чи NVARCHAR
. Робимо своєLEFT
1 символ перед тим, як додаток голиться деякий час, коли рядок є великим. Проблема в цьому полягає в тому, що він не працює правильно з рядками, що містять сурогатні пари.
Є ще один спосіб, зазначений у коментарі до прийнятої відповіді, використовуючи REPLACE(@s,' ','x')
. Цей прийом дає правильну відповідь, але на пару порядків повільніше, ніж інші методи, коли рядок великий.
З огляду на проблеми, що впроваджуються сурогатними парами на будь-якій техніці, яка використовує DATALENGTH
, я вважаю, що найбезпечнішим методом, який дає правильні відповіді, про які я знаю, є наступний:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
Це швидше, ніж REPLACE
техніка, і набагато швидше з довшими струнами. В основному ця методика - це LEN(@s + 'x') - 1
техніка, але із захистом для крайового випадку, коли струна має довжину 4000 (для nvarchar) або 8000 (для varchar), так що правильна відповідь дана навіть для цього. Він також повинен правильно обробляти струни із сурогатними парами.