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

CTE trả về lỗi

Trong SQL Server Thứ tự xử lý logic của câu lệnh SELECT , xác định thời điểm các đối tượng được xác định trong một bước được cung cấp cho các mệnh đề trong các bước tiếp theo:

  1. TỪ
  2. BẬT
  3. THAM GIA
  4. WHERE
  5. NHÓM THEO
  6. CÓ CUBE hoặc CÓ ROLLUP
  7. CHỌN
  8. DISTINCT
  9. ĐẶT HÀNG THEO
  10. HÀNG ĐẦU

Đây là cách truy vấn của bạn sẽ được tiến hành và truy vấn của bạn trông hoàn toàn ổn. Nhưng đôi khi, SQL Server quyết định không tuân theo thứ tự này để tối ưu hóa truy vấn của bạn.

Trong trường hợp của bạn, SQL Server có thể chỉ đơn giản là chuyển đổi / chuyển đổi truy vấn của bạn thành một truy vấn khác và thực hiện convert , trước khi áp dụng where isnumeric sự lọc.

Nếu chúng tôi đã làm cho truy vấn của bạn phức tạp hơn một chút (nhưng vẫn cho kết quả tương tự), thì SQL Server đang thực thi mã chính xác vào thời điểm này:

;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;

Trong trường hợp của bạn (và đây là điều tôi đang làm trong những tình huống như vậy khi các loại khác nhau được lưu trữ trong một cột), bạn chỉ cần sử dụng TRY_CONVERT chức năng:

;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. Cách lấy Giá trị trước cho Giá trị Null

  2. Thiết kế cơ sở dữ liệu:một bảng lớn hay các bảng riêng biệt?

  3. JDBC SQLServerException:Trình điều khiển này không được định cấu hình để xác thực tích hợp.

  4. Tách các giá trị được phân tách trong một cột SQL thành nhiều hàng

  5. Kiểm tra tình trạng máy chủ SQL chủ động, Phần 2:Bảo trì