2010-08-22 11 views
42

Wenn ich so etwas wieWas ist der richtige Weg, um eine NTEXT-Spalte mit einem konstanten Wert zu vergleichen?

[ntext2] <> '1,032.5', 

ich diesen Fehler:

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

Die bestmögliche Lösung wäre, wenn der Vergleich in der gleichen Art und Weise für jede Spalte Typ implementiert ist. (<> Operator gilt für NVARCHAR und INT).

+0

wandeln es in NVARCHAR (MAX) und alle String-Funktionen werden Ihnen zur Verfügung stehen ... NTEXT ist etwas chaotisch, es veraltet ist - es loswerden ! –

+2

Wenn jemand M $ bittet, die NTEXTs seiner CRM DB in NVARCHARs zu konvertieren, werde ich die Petition unterschreiben;) – noober

Antwort

48

Der Datentyp ntext ist nicht mehr gültig für den Datentyp nvarchar(max). Wenn Sie den Datentyp in der Tabelle ändern können, wäre das die beste Lösung. Dann ist es kein Problem, es mit einem varchar Literal zu vergleichen.

Andernfalls würden Sie den Wert vor dem Vergleich sie werfen müssen:

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

Sie können auch einen nvarchar wörtlichen verwenden, die in einige ähnliche Datentyp Probleme löst:

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

Leider ist dies keine Option, da MS ntext alleine verwendet, obwohl es gleichzeitig als veraltet deklariert ist. Ich werde sowohl N Präfix als auch Casting versuchen, danke für die Antwort. – noober

8

Wenn Sie lieber nicht zu werfen, können Sie in einigen Szenarien mit LIKE oder PATINDEX erhalten, wie in diesem MSDN-Thread gezeigt: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/6bd4c661-ea0b-435f-af78-097e61549d41

Der LIKE-Ausdruck ohne Platzhalter würde (in diesem Fall) in etwa einem Test auf Gleichheit entsprechen.

In diesem Fall würde der Ausdruck sein:

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

LIKE erfordert eine korrekte Indexierung der Datenbank (AFAIK). Ich möchte diese Anforderung vermeiden. – noober

+0

@noober: LIKE-Klauseln profitieren nicht viel von Indizes, außer wenn sie keine führenden Platzhalter enthalten. Eine Besetzung ignoriert wahrscheinlich einen vorhandenen Index. Wenn Sie sich Sorgen um die Leistung machen, wäre es in Ihrem Interesse, die einzelnen Optionen (cast, like, patindex) mit und ohne Index zu testen. Wenn ich heute einen Moment habe, werde ich es überprüfen. – kbrimington

+0

Nein, ich habe gerade LIKE mit NTEXTs auf verschiedenen DBs getestet, und es ist mit einem von ihnen gescheitert. Kann einfach nicht ausgeführt werden. Das Problem war etwas mit Indizes. Ich kann also nicht sicher sein, dass LIKE überall funktionieren wird. – noober

Verwandte Themen