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

MSSQL cast( [varcharColumn] to int) di SELECT dieksekusi sebelum klausa WHERE menyaring nilai buruk

Pertama, ini bukan "masalah desain yang mencolok". SQL adalah bahasa deskriptif output, bukan bahasa prosedural yang menentukan bagaimana proses dilakukan. Tidak ada jaminan urutan pemrosesan, secara umum, dan ini merupakan keuntungan. Saya mungkin mengatakan ada masalah desain, tetapi itu seputar penanganan umum pengecualian dalam pernyataan SQL.

Menurut dokumentasi SQL Server (http://msdn.microsoft.com/en-us/library/ms181765.aspx), Anda dapat bergantung pada urutan evaluasi untuk pernyataan CASE untuk ekspresi skalar . Jadi, yang berikut ini harus berfungsi:

select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)

Atau, untuk mendekati ekspresi "int":

select (case when isnumeric(c.varcharColumn) = 1 and c.varcharColumn not like '%.%' and c.varcharColumn not like '%e%'
             then cast(c.varcharColumn as int)
        end)

Setidaknya kode Anda melakukan CAST eksplisit. Situasi ini jauh lebih buruk ketika pemerannya tersirat (dan ada ratusan kolom).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memaksa batas waktu kueri di SQL Server

  2. SQL Server:cara mendapatkan nama database sebagai parameter dalam prosedur tersimpan

  3. cara mengenkripsi kolom kata sandi

  4. SQLServer vs StateServer untuk Kinerja Status Sesi ASP.NET

  5. Tambahkan Langkah Pekerjaan ke Pekerjaan Agen Server SQL yang Ada (T-SQL)