Câu trả lời:
Mọi thứ chỉ theo tiêu chuẩn ANSI:
SQL Server tuân theo đặc tả ANSI / ISO SQL-92 (Phần 8.2 ,, Quy tắc chung số 3) về cách so sánh chuỗi với khoảng trắng. Tiêu chuẩn ANSI yêu cầu đệm cho các chuỗi ký tự được sử dụng trong so sánh sao cho độ dài của chúng khớp với nhau trước khi so sánh chúng. Phần đệm ảnh hưởng trực tiếp đến ngữ nghĩa của các vị từ mệnh đề WHERE và HAVING và các so sánh chuỗi Transact-SQL khác. Ví dụ, Transact-SQL coi các chuỗi 'abc' và 'abc' là tương đương với hầu hết các hoạt động so sánh.
Ngoại lệ duy nhất cho quy tắc này là vị từ THÍCH. Khi bên phải của biểu thức vị từ THÍCH có một giá trị có khoảng trắng ở cuối, SQL Server không đệm hai giá trị này vào cùng một độ dài trước khi so sánh xảy ra. Bởi vì mục đích của vị từ THÍCH, theo định nghĩa, là để tạo điều kiện cho các tìm kiếm mẫu thay vì kiểm tra tính bằng chuỗi đơn giản, điều này không vi phạm phần của đặc tả ANSI SQL-92 đã đề cập trước đó.
Đây là một ví dụ nổi tiếng về tất cả các trường hợp được đề cập ở trên:
DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)
SET @a = '1'
SET @b = '1 ' --with trailing blank
SELECT 1
WHERE
@a = @b
AND @a NOT LIKE @b
AND @b LIKE @a
Dưới đây là một số chi tiết về khoảng trống dấu và LIKE
mệnh đề .
NHƯNG nếu bạn muốn khác biệt chúng - bạn có thể quyết định sử dụng DATALENGTH
chức năng thay vì LEN
, bởi vì
SELECT 1 WHERE LEN('John ') = LEN('John')
sẽ đặt bạn 1 thay vì
SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')
Giải pháp là
Bạn chỉ có thể thêm một khoảng trắng vào điều kiện của bạn.
set @X= 'John \n'
\n
không có ý nghĩa trong SQL Server. Nó không được hiểu là một dòng mới. Đây không phải là một câu trả lời cho câu hỏi được hỏi nào.