2008-11-20 33 views
7

Tôi muốn tìm tất cả các hàng trong bảng và khớp với một chuỗi nhạy cảm chính xác. Thật không may, bảng của tôi có trường hợp collation insensitive.Làm cách nào để thực hiện kết hợp chuỗi chính xác trên trường không phân biệt chữ hoa chữ thường?

Cách hiệu quả nhất để thực hiện việc này là gì.

Ví dụ:

Tôi muốn sau đây để trở về không có hàng:

select * from sysobject where name = 'Sysbinobjs' 

Đối với câu trả lời giả định @match là trong một biến:

declare @match varchar(4000) 
set @match = 'sysbinobjs' 

EDIT

Làm rõ, hãy chắc chắn các khoảng trống ở cuối được xử lý đúng cách, tôi muốn một kết hợp chính xác tính đến khoảng trắng ở cuối nên 'Hello' sẽ chỉ khớp với 'Hello' và không phải với 'Hello'

Trả lời

7

Dưới đây là một đoạn mã hoạt động, thật sự phức tạp để thực hiện điều này một cách an toàn và hiệu quả. Kết quả trùng khớp kép là tránh quét bảng (xem kế hoạch thực hiện). Các varbinary đúc lực lượng một chiều dài và trường hợp phù hợp. Vì vậy, dấu cách không gian được xử lý đúng cách và vỏ được xử lý đúng cách.

Lưu ý loại được so sánh cần phải giống với loại trong bảng cho phép biến đổi để làm việc (ví dụ: tên trong sysobject là nvarchar để @match sẽ cần phải là nvarchar).

declare @match nvarchar(4000) 
set @match = 'sysbinobjs' 


select * from sysobjects 
where name = @match and 
cast(name as varbinary(4000)) = cast(@match as varbinary(4000)) 
5

Thực ra tôi không thấy lý do tại sao bạn phải thực hiện thoát trước, điều này được tích hợp vào máy chủ SQL thông qua statLATE statment.

select * from sysobjects 
WHERE name = @match and --Get all relevant hits from the index before doing the final case sensitive test 
name COLLATE Latin1_General_CS_AS = @match COLLATE Latin1_General_CS_AS 
+0

Tôi đã đơn giản hóa câu trả lời của tôi, vấn đề với vấn đề này là dấu cách không được xử lý đúng cách, ví dụ: 'hello' = 'hello', tôi cũng nghĩ rằng các công cụ đối chiếu rất khó nhớ khi viết mã. –

+0

+1 Bạn là thiên tài của bạn tôi, giải pháp này làm việc tuyệt vời cho tôi !! –

Các vấn đề liên quan