Trong SQL Server
có 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:
- TỪ
- BẬT
- THAM GIA
- WHERE
- NHÓM THEO
- CÓ CUBE hoặc CÓ ROLLUP
- CÓ
- CHỌN
- DISTINCT
- ĐẶT HÀNG THEO
- 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