100 votes

Clause WHERE sur le type de données "Text" de SQL Server

Où [CastleType] est défini comme type de données "text" dans le serveur SQL et la requête est :

SELECT *
FROM   [Village]
WHERE  [CastleType] = 'foo' 

Je reçois l'erreur :

Les types de données TEXTE y VARCHAR sont incompatibles dans l'opérateur égal à.

Ne puis-je pas interroger ce type de données avec une clause WHERE ?

9 votes

Utilisez VARCHAR(MAX) au lieu de TEXT - ce type de données est déprécié

110voto

Martin Smith Points 174101

Vous pouvez utiliser LIKE au lieu de = . Sans aucun caractère de remplacement, cela aura le même effet.

DECLARE @Village TABLE
        (CastleType TEXT)

INSERT INTO @Village
VALUES
  (
    'foo'
  )

SELECT *
FROM   @Village
WHERE  [CastleType] LIKE 'foo' 

text est déprécié. Le passage à varchar(max) sera plus facile à travailler.

Quelle sera la taille des données ? Si vous devez faire des comparaisons d'égalité, vous voudrez idéalement indexer cette colonne. Cela n'est pas possible si vous déclarez que la colonne a une taille supérieure à 900 octets, mais vous pouvez ajouter une fonction de calcul de l'index. checksum o hash qui peut être utilisée pour accélérer ce type de requête.

26voto

Emma Thapa Points 101

Veuillez essayer ceci

SELECT *
FROM   [Village]
WHERE  CONVERT(VARCHAR, CastleType) = 'foo'

0 votes

Ceci est également utile pour pouvoir voir directement les données dans le champ TEXT si vous utilisez des outils comme Toad for Sql Server qui protègent les champs de type BLOB pour qu'ils soient vus à la première exécution. Vous pouvez toujours cliquer sur le champ pour demander à Toad de l'afficher, mais il s'agit d'une procédure en deux étapes.

0 votes

Notez que cela rendra probablement votre requête non chargeable .

14voto

Donnie Points 17312

Vous ne pouvez pas vous comparer à text avec le = mais doit utiliser l'une des fonctions de comparaison énumérées ci-dessous. aquí . Notez également la grande case d'avertissement en haut de la page, c'est important.

7voto

SoggyBottomBoy Points 1

Si vous ne pouvez pas modifier le type de données de la table elle-même pour utiliser varchar(max), modifiez votre requête comme suit :

SELECT *
FROM   [Village]
WHERE  CONVERT(VARCHAR(MAX), [CastleType]) = 'foo'

3voto

Will Marcouiller Points 11649

Ce n'est pas ce que dit le message d'erreur. Il dit que vous ne pouvez pas utiliser le = opérateur. Essayez par exemple LIKE 'foo' .

0 votes

Col IN ('foo', 'bar') est fondamentalement la même chose que Col = 'foo' or Col = 'bar' et auront le même problème.

0 votes

Martin : Merci pour la mise en évidence, je ne le savais pas. Je vais le corriger alors.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X