Có vấn đề với hai câu trả lời được bình chọn nhiều nhất. Câu trả lời đề xuất DATALENGTH
là dễ bị lỗi của lập trình viên. Kết quả của DATALENGTH
phải được chia cho 2 cho NVARCHAR
các loại, nhưng không chia cho VARCHAR
các loại. Điều này đòi hỏi kiến thức về loại mà bạn đang sử dụng và nếu loại đó thay đổi, bạn phải siêng năng thay đổi những nơi bạn đã sử dụng DATALENGTH
.
Ngoài ra còn có một vấn đề với câu trả lời được ủng hộ nhiều nhất (mà tôi thừa nhận là cách ưa thích của tôi để làm điều đó cho đến khi vấn đề này khiến tôi khó chịu). Nếu thứ mà bạn đang nhận có độ dài là kiểu NVARCHAR(4000)
và nó thực sự chứa một chuỗi 4000 ký tự, SQL sẽ bỏ qua ký tự được nối thêm thay vì truyền ngầm kết quả đến NVARCHAR(MAX)
. Kết quả cuối cùng là độ dài không chính xác. Điều tương tự cũng sẽ xảy ra với VARCHAR (8000).
Những gì tôi đã tìm thấy hoạt động, gần như nhanh như cũ LEN
, nhanh hơn LEN(@s + 'x') - 1
đối với các chuỗi lớn và không giả định chiều rộng ký tự bên dưới là như sau:
DATALENGTH(@s) / DATALENGTH(LEFT(LEFT(@s, 1) + 'x', 1))
Điều này nhận được độ dài dữ liệu, và sau đó chia cho độ dài dữ liệu của một ký tự duy nhất từ chuỗi. Phần phụ của 'x' bao gồm trường hợp chuỗi trống (sẽ cung cấp số chia cho 0 trong trường hợp đó). Điều này hoạt động cho dù @s
là VARCHAR
hoặc NVARCHAR
. Thực hiện LEFT
ký tự của 1 trước khi phần nối thêm bị cắt bớt một lúc khi chuỗi lớn. Tuy nhiên, vấn đề với điều này là nó không hoạt động chính xác với các chuỗi chứa các cặp thay thế.
Có một cách khác được đề cập trong một bình luận cho câu trả lời được chấp nhận, sử dụng REPLACE(@s,' ','x')
. Kỹ thuật đó đưa ra câu trả lời chính xác, nhưng chậm hơn một vài bậc về độ lớn so với các kỹ thuật khác khi chuỗi lớn.
Với các vấn đề được đưa ra bởi các cặp thay thế trên bất kỳ kỹ thuật nào sử dụng DATALENGTH
, tôi nghĩ rằng phương pháp an toàn nhất đưa ra câu trả lời chính xác mà tôi biết là:
LEN(CONVERT(NVARCHAR(MAX), @s) + 'x') - 1
Điều này nhanh hơn REPLACE
kỹ thuật và nhanh hơn nhiều với các chuỗi dài hơn. Về cơ bản kỹ thuật này là LEN(@s + 'x') - 1
kỹ thuật, nhưng với sự bảo vệ cho trường hợp cạnh trong đó chuỗi có độ dài 4000 (đối với nvarchar) hoặc 8000 (đối với varchar), do đó câu trả lời chính xác được đưa ra ngay cả cho điều đó. Nó cũng phải xử lý các chuỗi với các cặp thay thế một cách chính xác.