Di SQL Server
ada Urutan Pemrosesan Logis dari pernyataan SELECT
, yang menentukan kapan objek yang didefinisikan dalam satu langkah tersedia untuk klausa dalam langkah berikutnya:
- DARI
- AKTIF
- BERGABUNG
- DIMANA
- GROUP BY
- DENGAN KUBE atau DENGAN ROLLUP
- PUNYA
- PILIH
- BERBEDA
- PESAN OLEH
- ATAS
Beginilah cara kueri Anda akan diproses dan kueri Anda terlihat baik-baik saja. Namun terkadang, SQL Server
memutuskan untuk tidak mengikuti perintah ini untuk mengoptimalkan kueri Anda.
Dalam kasus Anda, SQL Server
mungkin hanya mengubah/mengubah kueri Anda menjadi kueri lain dan melakukan convert
fungsi, sebelum menerapkan where isnumeric
penyaringan.
Jika kami membuat kueri Anda sedikit lebih rumit (tetapi masih memberikan hasil yang sama), SQL Server
mengeksekusi kode dengan benar kali ini:
;with isnum AS (
SELECT result
FROM #temp
WHERE ISNUMERIC(result) = 1
GROUP BY result
HAVING MAX(result) = result
)
SELECT
result,
ISNUMERIC(result)
FROM isnum
WHERE CONVERT(INT,result) > 1;
Dalam kasus Anda (dan inilah yang saya lakukan dalam situasi seperti itu ketika berbagai jenis disimpan dalam satu kolom), Anda cukup menggunakan COBA_CONVERT fungsi:
;with isnum AS (
SELECT result
FROM #temp
WHERE ISNUMERIC(result) = 1)
SELECT
result,
ISNUMERIC(result)
FROM isnum
WHERE TRY_CONVERT(INT, result) > 1