Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kesalahan pengembalian CTE

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:

  1. DARI
  2. AKTIF
  3. BERGABUNG
  4. DIMANA
  5. GROUP BY
  6. DENGAN KUBE atau DENGAN ROLLUP
  7. PUNYA
  8. PILIH
  9. BERBEDA
  10. PESAN OLEH
  11. 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa ruang lingkup CONTEXT_INFO di SQL Server?

  2. Mengapa kueri T-SQL ke-2 berjalan jauh lebih cepat daripada yang pertama saat dipanggil oleh Reporting Services 2005 di aplikasi web

  3. ATAU Operator korsleting di SQL Server

  4. Bagaimana cara membuat skrip peran basis data server SQL?

  5. Pernyataan SQL - Bagaimana Meningkatkan kecepatan dengan pengindeksan