2010-08-22 7 views
42

Si j'utiliser quelque chose commeQuelle est la bonne façon de comparer une colonne NTEXT avec une valeur constante?

[ntext2] <> '1,032.5', 

Je reçois cette erreur:

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

La meilleure solution possible serait si la comparaison est mise en œuvre de la même manière pour tout type de colonne. (<> l'opérateur est applicable à la fois pour NVARCHAR et INT).

+0

convertir en NVARCHAR (MAX) et toutes les fonctions de chaîne sera disponible pour vous ... NTEXT est en désordre, il est dépréciée - se débarrasser ! –

+2

Si quelqu'un demande M $ pour convertir les NTEXT de sa base de données CRM en NVARCHARs, je signerai la pétition;) – noober

Répondre

48

Le type de données ntext est déprécié en faveur du type de données nvarchar(max). Si vous pouvez changer le type de données dans le tableau, ce serait la meilleure solution. Ensuite, il n'y a aucun problème en le comparant à un littéral varchar.

Sinon, vous auriez à jeter la valeur avant de le comparer:

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

Vous pouvez également envisager d'utiliser un nvarchar littéral, ce qui permet de résoudre certains problèmes de type de données similaires:

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

Malheureusement, ce n'est pas une option, puisque MS utilise ntext seul, bien qu'il le déclare obsolète en même temps. Je vais essayer le préfixe N et le casting, merci pour la réponse. – noober

8

Si vous préférez ne pas lancer, vous pouvez obtenir dans certains scénarios en utilisant LIKE ou PATINDEX, comme démontré sur ce fil MSDN: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/6bd4c661-ea0b-435f-af78-097e61549d41

L'expression LIKE, sans caractères génériques, serait (dans ce cas) à peu près équivalente à un test d'égalité.

Dans ce cas, l'expression serait:

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

LIKE nécessite que le DB soit indexé correctement (AFAIK). Je voudrais éviter cette situation. – noober

+0

@noober: Les clauses LIKE ne bénéficient pas beaucoup des index, sauf dans le cas où elles ne contiennent pas de caractères génériques. Une distribution ignorera probablement un index existant. Si vous êtes préoccupé par les performances, il serait dans votre intérêt de tester les performances de chacune des options (cast, like, patindex) avec et sans index. Si je reçois un moment aujourd'hui, je vais vérifier. – kbrimington

+0

Non, je viens de tester LIKE avec NTEXTs sur différents DB, et il a échoué avec l'un d'entre eux. Juste ne pouvait pas être exécuté. Le problème était quelque chose avec des indices. Donc, je ne peux pas être sûr que LIKE fonctionnera partout. – noober

Questions connexes