SQL Server 2012 và sau
Chỉ cần sử dụng Try_Convert
thay vì:
TRY_CONVERT mất giá trị truyền cho nó và cố gắng chuyển đổi nó sang data_type quy định.Nếu dàn diễn viên thành công, TRY_CONVERT trả về giá trị như data_type được chỉ định; nếu một lỗi xảy ra, null được trả về. Tuy nhiên, nếu bạn yêu cầu một chuyển đổi rõ ràng là không được phép, thì TRY_CONVERT không thành công với lỗi.
Read more about Try_Convert.
SQL Server 2008 và Đầu
Cách truyền thống xử lý này là do bảo vệ tất cả các biểu hiện với một tuyên bố trường hợp để không có vấn đề khi nó được đánh giá, nó sẽ không tạo ra một lỗi, thậm chí nếu nó hợp lý dường như câu lệnh CASE không cần thiết. Một cái gì đó như thế này:
SELECT
Account_Code =
Convert(
bigint, -- only gives up to 18 digits, so use decimal(20, 0) if you must
CASE
WHEN X.Account_Code LIKE '%[^0-9]%' THEN NULL
ELSE X.Account_Code
END
),
A.Descr
FROM dbo.Account A
WHERE
Convert(
bigint,
CASE
WHEN X.Account_Code LIKE '%[^0-9]%' THEN NULL
ELSE X.Account_Code
END
) BETWEEN 503100 AND 503205
Tuy nhiên, tôi thích sử dụng chiến lược như thế này với SQL Server 2005 trở lên:
SELECT
Account_Code = Convert(bigint, X.Account_Code),
A.Descr
FROM
dbo.Account A
OUTER APPLY (
SELECT A.Account_Code WHERE A.Account_Code NOT LIKE '%[^0-9]%'
) X
WHERE
Convert(bigint, X.Account_Code) BETWEEN 503100 AND 503205
Điều này không được chiến lược chuyển đổi các Account_Code
giá trị cho NULL
bên trong của bảng X
khi chúng không phải là số. Ban đầu, tôi đã sử dụng CROSS APPLY
nhưng vì đã chỉ ra một lỗi như vậy vì điều này dẫn đến cùng một lỗi vì trình phân tích cú pháp truy vấn chạy vào cùng một vấn đề chính xác về việc tối ưu hóa nỗ lực của tôi để buộc thứ tự biểu thức (vị từ đẩy xuống đánh bại nó). Bằng cách chuyển sang OUTER APPLY
, nó đã thay đổi ý nghĩa thực tế của hoạt động sao cho X.Account_Code
có thể chứa các giá trị NULL
trong truy vấn bên ngoài, do đó yêu cầu thứ tự đánh giá thích hợp.
Bạn có thể quan tâm để đọc Erland Sommarskog's Microsoft Connect request về vấn đề đặt hàng đánh giá này. Ông thực tế gọi đó là một lỗi.
Có vấn đề khác ở đây nhưng tôi không thể giải quyết chúng ngay bây giờ.
P.S. Tôi đã có một động não ngày hôm nay. Một thay thế cho "cách truyền thống" mà tôi đề xuất là biểu thức SELECT
với tham chiếu bên ngoài, cũng hoạt động trong SQL Server 2000. (Tôi đã nhận thấy rằng kể từ khi học CROSS/OUTER APPLY
Tôi đã cải thiện khả năng truy vấn của mình với các phiên bản SQL Server cũ hơn, quá - như tôi nhận được linh hoạt hơn với khả năng "tài liệu tham khảo bên ngoài" của SELECT
, ON
và WHERE
khoản)
SELECT
Account_Code =
Convert(
bigint,
(SELECT A.AccountCode WHERE A.Account_Code NOT LIKE '%[^0-9]%')
),
A.Descr
FROM dbo.Account A
WHERE
Convert(
bigint,
(SELECT A.AccountCode WHERE A.Account_Code NOT LIKE '%[^0-9]%')
) BETWEEN 503100 AND 503205
Đó là ngắn hơn rất nhiều so với báo cáo kết quả CASE
.
gì phiên bản của SQL Server? – ErikE