2010-12-03 10 views
71

Wo [Castle] als Datentyp "Text" in SQL Server und die Abfrage gesetzt:WHERE-Klausel in SQL Server "Text" Datentyp

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

ich den Fehler:

The data types TEXT and VARCHAR are incompatible in the equal to operator.

Kann ich diesen Datentyp nicht mit einer WHERE-Klausel abfragen?

+8

Verwenden Sie 'VARCHAR (MAX)' anstelle von 'TEXT' - dieser Datentyp ist veraltet –

Antwort

10

Sie können nicht mit text mit dem Operator = vergleichen, sondern müssen stattdessen eine der aufgeführten Vergleichsfunktionen here verwenden. Beachten Sie auch das große Warnfeld oben auf der Seite, das ist wichtig.

79

Sie können LIKE anstelle von = verwenden. Ohne Wildcards wird dies den gleichen Effekt haben.

DECLARE @Village TABLE 
     (CastleType TEXT) 

INSERT INTO @Village 
VALUES 
    (
    'foo' 
) 

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

text ist veraltet. Der Wechsel zu varchar(max) wird einfacher zu handhaben sein.

Auch wie groß sind die Daten wahrscheinlich? Wenn Sie Gleichheitsvergleiche durchführen, sollten Sie diese Spalte idealerweise indizieren. Dies ist nicht möglich, wenn Sie die Spalte als etwas breiter als 900 Byte deklarieren, obwohl Sie eine berechnete checksum oder hash Spalte hinzufügen können, die verwendet werden kann, um diese Art der Abfrage zu beschleunigen.

2

Das ist nicht, was die Fehlermeldung sagt. Es besagt, dass Sie den Operator = nicht verwenden können. Versuchen Sie zum Beispiel LIKE 'foo'.

+0

' Col IN ('foo', 'bar') 'ist im Grunde das gleiche wie' Col = 'foo' oder Col = "bar" und wird das gleiche Problem haben. –

+0

@Martin: Danke für das Highlight, ich wusste es nicht. Ich werde es dann korrigieren. –

0

wäre eine weitere Option:

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

Ich vermute, dass "like 'foo'" bessere Kardinalitätsschätzungen als dieser Ansatz geben, aber nicht 100% sicher bin. –

+0

@Martin: Da Sie eine TEXT-Spalte nicht indexieren können, werden Sie in beiden Fällen einen vollständigen Tabellenscan erhalten. –

+0

Ich stimme zu, aber es wird immer noch Statistiken über die Spalte verwenden, um eine Schätzung der Zeilen zu erhalten, die die Join-Entscheidungen etc. beeinflussen können. –

-2

Ich bin mit MySQL und diese Abfrage funktioniert für mich:

SELECT * 
FROM @Village 
WHERE CastleType LIKE '%foo%'; 
+1

OP verwendet MSSQL nicht MySQL. – CarstenSchmitz

2

Wenn Sie den Datentyp auf dem Tisch nicht ändern kann, selbst varchar zu verwenden (max), dann gehen Sie bitte zum dies ändern:

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

Bitte versuchen Sie diese

+0

Dies ist auch nützlich, um die Daten im Feld TEXT direkt anzeigen zu können, wenn Sie einige Tools wie Toad for Sql Server verwenden, die BLOB-Felder schützen, die bei der ersten Ausführung angezeigt werden. Sie können immer auf das Feld klicken, um Toad anzuweisen, das Feld anzuzeigen, aber es ist eine zweistufige Prozedur. – Roger

+0

Beachten Sie, dass dies Ihre Abfrage wahrscheinlich [non-sargable] (https://en.wikipedia.org/wiki/Sargable) ergibt. – Heinzi

Verwandte Themen