我有這樣的可能值一列與ISNUMERIC捕獲異常的SQL Server
1
65
5 excellent
54
-1
-
.
如果我用ISNUMERIC與最後一個例子,我得到1,但是當我嘗試轉換爲數字我得到一個錯誤。我想在函數中使用try-catch但我不能,我該如何處理?
我有這樣的可能值一列與ISNUMERIC捕獲異常的SQL Server
1
65
5 excellent
54
-1
-
.
如果我用ISNUMERIC與最後一個例子,我得到1,但是當我嘗試轉換爲數字我得到一個錯誤。我想在函數中使用try-catch但我不能,我該如何處理?
順便說一句,一個更糟糕的例子是'-.'
,這isnumeric()
認爲是有效的。
我的建議是在數值中至少查找一位數字。令人討厭的,但:
isnumeric(val) and val like '%[0-9]%'
注意isnumeric()
也考慮一些指數表示法是有效的。因此'8e4'
將測試爲正面。這對您來說可能不是問題,因爲它會轉換爲有效值。這樣的匹配在過去造成我的問題,所以我傾向於使用類似:
val not like '%[^0-9.]%' and val not like '%.%.%' and val like '%[0-9]%'
也就是說,只有小數點和數字。並且,它沒有兩個小數點。但是,它只適用於正面價值。
我認爲你正在尋找的東西是這樣的:
選擇的情況下ISNUMERIC( 'A')時,1然後轉換(INT, 'A')否則返回null結束
莫非你解釋你的目標?像這樣的東西可能是有用的:
SELECT CASE ISNUMERIC(col)
WHEN 1 THEN CAST(col as float) -- or int, decimal, etc.
ELSE NULL -- Or 0, -9999, or whatever value you want to use as "exception" value
END
TRY ... CATCH構造不能在用戶定義的函數中使用。
http://msdn.microsoft.com/en-us/library/ms175976%28v=SQL.105%29.aspx
如果您在SQL Server 2012中的工作,我建議使用TRY_CONVERT:
select TRY_CONVERT(int, '.')
回報NULL
,而不是一個錯誤。