2010-04-12 20 views
6

我有這個值「0310D45」SQL Server 2005中則IsNumeric不要再追「0310D45」

我用ISNUMERIC檢查,如果值是強制轉換爲BIGINT之前的數字。不幸的是,這個值通過了isnumeric檢查。所以我的查詢失敗說:

Msg 8114, Level 16, State 5, Line 3 
Error converting data type varchar to bigint. 

什麼是最簡單的方法來處理這個。我正在考慮使用charindex,但我必須檢查所有26個字母。

有沒有簡單的解決方案,我沒有看到?我真的不想創建一個用戶定義的函數。

感謝

回答

9

看看這篇文章名爲What is wrong with IsNumeric()?其中包含以下抽象:

摘要: T-SQL的ISNUMERIC()函數有問題。它可能會錯誤地將 的非數字字母和符號(如D,E和£),甚至是 (CHAR(9))作爲數字。

不幸的是,它看起來像IsNumeric只是很奇怪,你將不得不寫幾行T-SQL來解決它。 (通過怪異我的意思是,如果評估的數據可以轉換成任何數值類型可言,它會被轉換。)

4

我最近遇到這個問題,正在尋找解決方案。我想我找到了兩個,並且想在這裏發佈它們,以便其他人更容易找到。 第一種方法是使用正則表達式和SQLServer功能PATINDEX()

IF PATINDEX('%[^0-9]%', @testString) = 0 

第二種解決方案是一個字符串「E0」串聯到測試串並仍然使用SQLServer的功能ISNUMERIC()與連接字符串。由於數字格式中使用了不同的符號,ISNUMERIC無法檢測到字符(如d,e,x)的存在,但它仍然只允許一個字符。因此,連接'e0'可防止函數在需要時給你一個錯誤的真實值。

IF (ISNUMERIC (@testString + 'e0') = 1) 

希望這有助於