2010-08-22 16 views
42

Jeśli używam coś podobnegoJaki jest właściwy sposób porównywania kolumny NTEXT ze stałą wartością?

[ntext2] <> '1,032.5', 

otrzymuję ten błąd:

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

Najlepszym możliwym rozwiązaniem byłoby, gdyby porównanie jest realizowany w ten sam sposób dla każdego typu kolumny. (<> operator ma zastosowanie zarówno do NVARCHAR, jak i INT).

+0

przekonwertować go na nvarchar (max) i wszystkich funkcji smyczkowych będą dostępne dla Ciebie ... NTEXT jest brudny, to przestarzała - go pozbyć ! –

+2

Jeśli ktokolwiek poprosi M $ o konwersję NTEXTów CRM DB do NVARCHAR, podpiszę petycję;) – noober

Odpowiedz

48

Typ danych ntext jest przestarzały na rzecz typu danych nvarchar(max). Jeśli możesz zmienić typ danych w tabeli, byłoby to najlepsze rozwiązanie. Wtedy nie ma problemu z porównaniem go z literałem.

W przeciwnym razie trzeba by rzucić wartość przed porównując go:

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

Można również rozważyć użycie nvarchar dosłowne, która rozwiązuje kilka podobnych problemów Typ danych:

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

Niestety, nie jest to opcja, ponieważ MS używa ntext na własną rękę, chociaż deklaruje, że jest przestarzałe w tym samym czasie. Spróbuję zarówno przedrostka N, jak i odlewania, dziękuję za odpowiedź. – noober

8

Jeśli byś Wolę nie rzutować, można uzyskać w niektórych scenariuszach przy użyciu LIKE lub PATINDEX, jak zademonstrowano w tym wątku MSDN: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/6bd4c661-ea0b-435f-af78-097e61549d41

Wyrażenie LIKE, bez symboli wieloznacznych, byłoby (w tym przypadku) mniej więcej równoznaczne z testem na równość.

W tym przypadku, wyrażenie byłoby:

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

LIKE wymaga poprawnego indeksowania bazy danych (AFAIK). Chciałbym tego uniknąć. – noober

+0

@noober: Klauzule LIKE nie odnoszą wiele korzyści z indeksów, z wyjątkiem przypadków, gdy nie zawierają symboli wieloznacznych. Obsada prawdopodobnie zignoruje istniejący indeks. Jeśli obawiasz się o wydajność, w najlepszym interesie leży test wydajności każdej z opcji (cast, like, patindex) z indeksem i bez niego. Jeśli dostanę chwilę dzisiaj, sprawdzę to. – kbrimington

+0

Nie, właśnie testowałem LIKE z NTEXT na różnych bazach danych i nie udało mi się z jednym z nich. Po prostu nie można było wykonać. Problem polegał na indeksach. Nie mogę więc być pewien, że LIKE będzie działać wszędzie. – noober

Powiązane problemy