我有这样的可能值一列与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
,而不是一个错误。