2010-08-22 22 views
42

Nếu tôi sử dụng một cái gì đó giống nhưCách nào đúng để so sánh cột NTEXT với giá trị không đổi?

[ntext2] <> '1,032.5', 

tôi nhận được lỗi này:

The data types ntext and varchar are incompatible in the not equal to operator.

Giải pháp tốt nhất có thể sẽ là nếu so sánh được thực hiện trong cùng một cách cho bất kỳ loại cột. (<> toán tử được áp dụng cho cả NVARCHAR và INT).

+0

chuyển nó sang NVARCHAR (MAX) và tất cả các chức năng chuỗi sẽ có sẵn cho bạn ... NTEXT là lộn xộn, nó bị phản đối - thoát khỏi nó ! –

+2

Nếu ai đó yêu cầu M $ chuyển đổi NTEXT của DBDB thành NVARCHAR, tôi sẽ ký vào đơn thỉnh nguyện;) – noober

Trả lời

48

Loại dữ liệu ntext không còn được dùng để ủng hộ loại dữ liệu nvarchar(max). Nếu bạn có thể thay đổi kiểu dữ liệu trong bảng, đó sẽ là giải pháp tốt nhất. Sau đó, không có vấn đề gì khi so sánh nó với một số varchar.

Nếu không, bạn sẽ phải bỏ giá trị trước khi so sánh nó:

cast([ntext2] as nvarchar(max)) <> '1,032.5' 

Bạn cũng có thể xem xét sử dụng một nvarchar theo nghĩa đen, mà giải quyết một số vấn đề kiểu dữ liệu tương tự:

cast([ntext2] as nvarchar(max)) <> N'1,032.5' 
+1

Thật không may, nó không phải là một lựa chọn, vì MS sử dụng ntext, mặc dù nó tuyên bố nó không dùng nữa. Tôi sẽ thử cả tiền tố N và truyền, nhờ câu trả lời. – noober

8

Nếu bạn sẽ không muốn truyền, bạn có thể nhận được trong một số trường hợp sử dụng LIKE hoặc PATINDEX, như được minh họa trên chủ đề MSDN này: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/6bd4c661-ea0b-435f-af78-097e61549d41

Biểu thức LIKE, không có ký tự đại diện, sẽ là (trong trường hợp này) tương đương với một phép thử cho sự bình đẳng.

Trong trường hợp này, khái niệm sẽ là:

[ntext2] NOT LIKE '1,032.5' 
+0

LIKE yêu cầu DB phải được lập chỉ mục đúng (AFAIK). Tôi muốn tránh sự hân hoan này. – noober

+0

@noober: Các mệnh đề LIKE không được hưởng lợi nhiều từ các chỉ mục, ngoại trừ trong trường hợp chúng không chứa các ký tự đại diện hàng đầu. Một diễn viên có thể sẽ bỏ qua một chỉ mục hiện có. Nếu bạn lo lắng về hiệu suất, nó sẽ là lợi ích tốt nhất của bạn để kiểm tra hiệu suất mỗi tùy chọn (diễn viên, như, patindex) có và không có chỉ mục. Nếu tôi có một chút thời gian hôm nay, tôi sẽ kiểm tra nó. – kbrimington

+0

Không, tôi chỉ thử nghiệm LIKE với NTEXT trên các DB khác nhau và không thành công với một trong số chúng. Chỉ không thể thực hiện được. Vấn đề là một cái gì đó với các chỉ số. Vì vậy, tôi không thể chắc chắn rằng LIKE sẽ làm việc ở khắp mọi nơi. – noober

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