2010-12-03 20 views
71

Donde [CastleType] se establece como tipo de datos "texto" en SQL Server y la consulta es:cláusula WHERE de SQL Server "texto" tipo de datos

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

me sale el error:

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

¿No puedo consultar este tipo de datos con una cláusula WHERE?

+8

Uso VARCHAR (MAX) 'en lugar de' Text' - que tipo de datos está en desuso –

Respuesta

10

No se puede comparar con text con el operador =, sino que debe utilizar una de las funciones de comparación enumeradas here. También tenga en cuenta el gran cuadro de advertencia en la parte superior de la página, es importante.

79

Puede usar LIKE en lugar de =. Sin ningún comodín, esto tendrá el mismo efecto.

DECLARE @Village TABLE 
     (CastleType TEXT) 

INSERT INTO @Village 
VALUES 
    (
    'foo' 
) 

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

text está obsoleto. Cambiar a varchar(max) será más fácil de trabajar.

¿Cuán grande es la probabilidad de los datos? Si va a hacer comparaciones de igualdad, idealmente querrá indexar esta columna. Esto no es posible si declara la columna como algo más ancho que 900 bytes, aunque puede agregar una columna calculada checksum o hash que se puede usar para acelerar este tipo de consulta.

2

Eso no es lo que dice el mensaje de error. Dice que no puede usar el operador =. Pruebe por ejemplo LIKE 'foo'.

+0

'Col EN ('parametro', 'valor')' es básicamente lo mismo que 'Col = 'foo' o Col = 'bar'' y tendrá el mismo problema. –

+0

@Martin: Gracias por destacar, no lo sabía. Lo corregiré entonces. –

0

Otra opción sería:

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

Sospecho que 'me gusta 'foo'' podría dar mejores estimaciones de cardinalidad que este enfoque, pero no estoy 100% seguro. –

+0

@Martin: como no puede indexar una columna de TEXTO, creo que terminará con una exploración de tabla completa en ambos casos. –

+0

Acepto, pero seguirá usando estadísticas en la columna para obtener una estimación de las filas que se devolverán, lo que podría afectar decisiones de unión, etc. –

-2

estoy usando MySQL y esta consulta funciona para mí:

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

OP está utilizando MSSQL no MySQL. – CarstenSchmitz

2

Si no puede cambiar el tipo de datos en la propia tabla de usar varchar (max), a continuación, cambiar la consulta a este:

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

Por favor, intente esta

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

Esto también es útil para poder ver directamente los datos en el campo TEXTO si está utilizando algunas herramientas como Toad for Sql Server que protegen los campos de tipo BLOB para ser vistos en la primera ejecución. Siempre puede hacer clic en el campo para decirle a Toad que muestre el campo, pero es un procedimiento de dos pasos. – Roger

+0

Tenga en cuenta que esto probablemente hará que su consulta [no sargable] (https://en.wikipedia.org/wiki/Sargable). – Heinzi