web-dev-qa-db-fra.com

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

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

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

Je reçois l'erreur:

Les types de données ([~ # ~] text [~ # ~] et VARCHAR sont incompatibles dans l'opérateur égal à.

Puis-je interroger ce type de données avec une clause WHERE?

81
mmcglynn

Vous pouvez utiliser LIKE au lieu de =. Sans aucun caractère générique, 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 obsolète. Passer à varchar(max) sera plus facile à utiliser.

Aussi, quelle est la taille probable des données? Si vous voulez faire des comparaisons d’égalité, vous voudrez idéalement indexer cette colonne. Cela n'est pas possible si vous déclarez que la colonne dépasse 900 octets, mais vous pouvez ajouter une colonne calculée checksum ou hash pouvant être utilisée pour accélérer ce type de requête.

93
Martin Smith

S'il vous plaît essayer ceci

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

Vous ne pouvez pas comparer avec text avec le = _ opérateur, mais doit utiliser l’une des fonctions de comparaison répertoriées ici . Notez également la grande boîte d’avertissement en haut de la page, c’est important.

13
Donnie

Si vous ne pouvez pas changer le type de données sur la table pour utiliser varchar (max), modifiez votre requête en ceci:

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

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'.

2
Will Marcouiller

Une autre option serait:

SELECT * FROM [Village] WHERE PATINDEX('foo', [CastleType]) <> 0
0
Joe Stefanelli

Cela fonctionne dans MSSQL et MySQL:

SELECT *
FROM   Village
WHERE  CastleType LIKE '%foo%'; 
0
himan