Donde [CastleType] se establece como tipo de datos "texto" en SQL Server y la consulta es:
SELECT *
FROM [Village]
WHERE [CastleType] = 'foo'
Me sale el error:
Los tipos de datos TEXT y VARCHAR son incompatibles en el operador igual a.
¿No puedo consultar este tipo de datos con una cláusula WHERE?
sql-server
sql-server-2005
tsql
mmcglynn
fuente
fuente
VARCHAR(MAX)
lugar deTEXT
- ese tipo de datos está obsoletoRespuestas:
Puede usar en
LIKE
lugar de=
. Sin comodines, esto tendrá el mismo efecto.DECLARE @Village TABLE (CastleType TEXT) INSERT INTO @Village VALUES ( 'foo' ) SELECT * FROM @Village WHERE [CastleType] LIKE 'foo'
text
es obsoleto. Cambiar avarchar(max)
será más fácil de trabajar.Además, ¿cuál es el tamaño probable de los datos? Si va a hacer comparaciones de igualdad, idealmente querrá indexar esta columna. Esto no es posible si declara que la columna tiene un ancho superior a 900 bytes, aunque puede agregar una columna calculada
checksum
ohash
que se pueda usar para acelerar este tipo de consulta.fuente
Por favor intente esto
SELECT * FROM [Village] WHERE CONVERT(VARCHAR, CastleType) = 'foo'
fuente
No puede comparar
text
con el=
operador, sino que debe utilizar una de las funciones de comparación enumeradas aquí . También tenga en cuenta el cuadro de advertencia grande en la parte superior de la página, es importante.fuente
Si no puede cambiar el tipo de datos en la tabla para usar varchar (max), cambie su consulta a esto:
SELECT * FROM [Village] WHERE CONVERT(VARCHAR(MAX), [CastleType]) = 'foo'
fuente
Eso no es lo que dice el mensaje de error. Dice que no puede utilizar el
=
operador. Prueba, por ejemploLIKE 'foo'
.fuente
Col IN ('foo', 'bar')
es básicamente el mismoCol = 'foo' or Col = 'bar'
y tendrá el mismo problema.Otra opcion seria:
SELECT * FROM [Village] WHERE PATINDEX('foo', [CastleType]) <> 0
fuente
like 'foo'
podría dar mejores estimaciones de cardinalidad que este enfoque, pero no estoy 100% seguro.Esto funciona en MSSQL y MySQL:
SELECT * FROM Village WHERE CastleType LIKE '%foo%';
fuente