2010-12-13 26 views
7

Bất kỳ ý tưởng nào tại sao ISNUMERIC('0D0') = 1 là TRUE trong SQL Server 2008?Tại sao "0D0" được coi là số trong SQL Server 2008?

Tôi đang xác thực số ID từ một hệ thống khác, đôi khi có chứa các chữ cái mà chúng tôi không muốn mang lại, nhưng kết hợp này đang vấp phải mã (ID cụ thể mà nó cho là số là "005406257D6") . Hạ lưu chúng tôi đang thực hiện CONVERT(BIGINT, @val), điều này rõ ràng là bị nghẹt thở khi tìm thấy các giá trị "D" này.

Tôi đang nhấn trường hợp đặc biệt nào và làm cách nào để giải quyết?

+0

+1 - Hình như nó cũng làm việc cho 'E', nhưng không phải cho AC (vì vậy nó không phải là một điều HEX) ... – JNK

+0

Xem thêm http://stackoverflow.com/questions/2358147/best-equivalent-for-isinteger-in-sql-server Câu trả lời của gbn là thú vị và đáng thử IMO .. –

+0

@JNK afaik "D" là viết tắt của Thập phân. –

Trả lời

11

Về cơ bản, IsNumeric là vô ích - tất cả điều đó xác minh là chuỗi có thể được chuyển đổi thành bất kỳ số nào của các loại số. Trong trường hợp này, "0D0" có thể được chuyển đổi thành phao. (Tôi không thể nhớ lý do, nhưng có hiệu quả "D" là một từ đồng nghĩa với "E", và có nghĩa là nó ký hiệu khoa học):

select CONVERT(float,'2D3') 

Nếu bạn muốn xác minh rằng nó chỉ là chữ số, sau đó not @val like '%[^0-9]%' sẽ là một thử nghiệm tốt hơn. Bạn có thể cải thiện thêm điều này bằng cách thêm một kiểm tra chiều dài.

+0

Thực tế, "0D0" LIKE '% [^ 0-9]%' là TRUE, nhưng tôi thấy quan điểm của bạn. – gfrizzle

+0

@gfrizzle - bạn đã bỏ lỡ 'không' lúc bắt đầu –

+0

@gfrizzle - bạn cần phải thực hiện' NOT LIKE' trên biểu thức đó vì nó có '^' ở đầu chỉ ra NOT. I E. bạn đang hỏi "Có phải nó không phải là tất cả các con số không?" – JNK

0

Giải thích lý do tại sao.

http://www.sqlservercentral.com/articles/IsNumeric/71512/

(dưới đây là @ query/danh sách đầy đủ hơn RedFilter của)

SELECT [Ascii Code] = STR(Number) 
     ,[Ascii Character] = CHAR(Number) 
     ,[ISNUMERIC Returns] = ISNUMERIC(CHAR(Number)) 
FROM Master.dbo.spt_Values 
WHERE Type = 'P' 
     AND Number BETWEEN 0 AND 255 
     AND ISNUMERIC(CHAR(Number)) = 1 
UNION 
SELECT [Ascii Code] = STR(Number) 
     ,[Ascii Character] = CHAR(Number) 
     ,[ISNUMERIC Returns] = ISNUMERIC('0' + CHAR(Number) + '0') 
FROM Master.dbo.spt_Values 
WHERE Type = 'P' 
     AND Number BETWEEN 0 AND 255 
     AND ISNUMERIC('0' + CHAR(Number) + '0') = 1 

yeilds

Ascii Code Ascii Character 
---------- --------------- 
    0  
    9  
    10  
    11  
    12  
    13  
    36 $ 
    43 + 
    44 , 
    45 - 
    46 . 
    48 0 
    49 1 
    50 2 
    51 3 
    52 4 
    53 5 
    54 6 
    55 7 
    56 8 
    57 9 
    68 D 
    69 E 
    92 \ 
    100 d 
    101 e 
    128 € 
    160   
    162 ¢ 
    163 £ 
    164 ¤ 
    165 ¥ 
+0

Thực ra, nó phải là 'CHỌN [Mã Ascii] = STR (Số), [Ký tự Ascii] = CHAR (Số), [ISNUMERIC Returns] = ISNUMERIC (CHAR (Số)) FROM Master.dbo. spt_Values ​​ ĐÂU Loại = 'P' VÀ số giữa 0 và 255 VÀ IsNumeric (CHAR (Số)) = 1 đoàn CHỌN [Ascii Mã] = STR (Số), [Ascii Character] = CHAR (Số) , [ISNUMERIC Returns] = ISNUMERIC ('0' + CHAR (Số) + '0') TỪ Master.dbo.spt_Values ​​ WHERE Type = 'P' VÀ SỐ GIỮ 0 VÀ 255 VÀ ISNUMERIC ('0' + CHAR (Số) + '0') = 1' – RedFilter

+0

Cảm ơn @RedFilter, tôi vừa sao chép/dán từ bài viết (vì trang web yêu cầu đăng ký để xem nó). Tôi đã kết hợp cập nhật của bạn. – Brad

Các vấn đề liên quan