Di mana [CastleType] disetel sebagai tipe data "teks" di SQL Server dan kuerinya adalah:
SELECT *
FROM [Village]
WHERE [CastleType] = 'foo'
Saya mendapatkan kesalahan:
Jenis data TEXT dan VARCHAR tidak kompatibel di operator yang sama.
Bisakah saya tidak menanyakan tipe data ini dengan klausa WHERE?
sql-server
sql-server-2005
tsql
mmcglynn.dll
sumber
sumber
VARCHAR(MAX)
alih-alihTEXT
- tipe data itu tidak digunakan lagiJawaban:
Anda dapat menggunakan
LIKE
sebagai pengganti=
. Tanpa karakter pengganti apa pun, ini akan memiliki efek yang sama.DECLARE @Village TABLE (CastleType TEXT) INSERT INTO @Village VALUES ( 'foo' ) SELECT * FROM @Village WHERE [CastleType] LIKE 'foo'
text
sudah ditinggalkan. Mengubah menjadivarchar(max)
akan lebih mudah untuk dikerjakan.Juga seberapa besar kemungkinan datanya? Jika Anda akan melakukan perbandingan kesetaraan, idealnya Anda ingin mengindeks kolom ini. Ini tidak mungkin jika Anda mendeklarasikan kolom sebagai sesuatu yang lebih lebar dari 900 byte meskipun Anda dapat menambahkan kolom yang dihitung
checksum
atauhash
yang dapat digunakan untuk mempercepat jenis kueri ini.sumber
Silakan coba ini
SELECT * FROM [Village] WHERE CONVERT(VARCHAR, CastleType) = 'foo'
sumber
Anda tidak dapat membandingkan
text
dengan=
operator, tetapi harus menggunakan salah satu fungsi perbandingan yang tercantum di sini . Perhatikan juga kotak peringatan besar di bagian atas halaman, ini penting.sumber
Jika Anda tidak dapat mengubah tipe data pada tabel itu sendiri untuk menggunakan varchar (max), maka ubah kueri Anda menjadi ini:
SELECT * FROM [Village] WHERE CONVERT(VARCHAR(MAX), [CastleType]) = 'foo'
sumber
Bukan itu yang dikatakan pesan kesalahan. Dikatakan bahwa Anda tidak dapat menggunakan
=
operator. Coba misalnyaLIKE 'foo'
.sumber
Col IN ('foo', 'bar')
pada dasarnya samaCol = 'foo' or Col = 'bar'
dan akan memiliki masalah yang sama.Pilihan lainnya adalah:
SELECT * FROM [Village] WHERE PATINDEX('foo', [CastleType]) <> 0
sumber
like 'foo'
mungkin memberikan perkiraan kardinalitas yang lebih baik daripada pendekatan ini tetapi saya tidak yakin 100%.Ini berfungsi di MSSQL dan MySQL:
SELECT * FROM Village WHERE CastleType LIKE '%foo%';
sumber