Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truyền MSSQL ([varcharColumn] thành int) trong SELECT được thực thi trước khi mệnh đề WHERE lọc ra các giá trị không hợp lệ

Đầu tiên, đây không phải là "vấn đề thiết kế chói mắt". SQL là một ngôn ngữ mô tả của đầu ra, không phải là một ngôn ngữ thủ tục chỉ định cách thức thực hiện đánh giá. Nói chung, không có gì đảm bảo về thứ tự xử lý và đây là một lợi thế. Tôi có thể nói rằng có một vấn đề thiết kế, nhưng đó là vấn đề xung quanh việc xử lý chung các ngoại lệ trong các câu lệnh SQL.

Theo tài liệu SQL Server (http://msdn.microsoft.com/en-us/library/ms181765.aspx), bạn có thể phụ thuộc vào thứ tự loại bỏ cho câu lệnh CASE cho biểu thức vô hướng . Vì vậy, những điều sau sẽ hoạt động:

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

Hoặc, để đến gần hơn với biểu thức "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)

Ít nhất mã của bạn đang thực hiện một CAST rõ ràng. Tình huống này còn tệ hơn nhiều khi các phôi ẩn (và có hàng trăm cột).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các thủ tục được lưu trữ / lược đồ DB trong kiểm soát nguồn

  2. Làm cách nào để cải thiện hiệu suất cho tính năng lọc ngày giờ trong SQL Server?

  3. Coi cột là loại khác nhau để sắp xếp

  4. Tính toán chi phí trung bình có trọng số vĩnh viễn SQL Server 2008

  5. Tập lệnh cho tất cả dữ liệu từ cơ sở dữ liệu SQL Server