在sql server中使用isnumeric捕获异常

时间:2013-07-24 15:18:04

标签: sql sql-server

我在列

中有这些可能的值
1
65
5 excellent
54
-1
-
.

如果我使用isnumeric和最后一个例子我得到1,但是当我尝试转换为数字时我得到了一个错误。我想在函数中使用try-catch,但我不能,我该如何处理?

5 个答案:

答案 0 :(得分:4)

顺便说一句,更糟糕的例子是'-.'isnumeric()认为这是有效的。

我的建议是在值中至少查找一位数字。呀,但是:

isnumeric(val) and val like '%[0-9]%'

请注意isnumeric()也认为指数表示法中的某些内容有效。所以'8e4'将测试为正面。这对您来说可能不是问题,因为它会转换为有效值。这样的比赛在过去对我造成了问题,所以我倾向于使用类似的东西:

val not like '%[^0-9.]%' and val not like '%.%.%' and val like '%[0-9]%'

也就是说,它只有小数点和数字。并且,它没有两个小数点。但是,它只适用于正值。

答案 1 :(得分:1)

我认为你正在寻找这样的东西:

  

选择case isnumeric('a')当1然后转换(int,'a')else else null

答案 2 :(得分:0)

你能解释一下你的目标吗?这样的事情可能很有用:

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

答案 3 :(得分:0)

TRY ... CATCH构造不能在用户定义的函数中使用。

http://msdn.microsoft.com/en-us/library/ms175976%28v=SQL.105%29.aspx

答案 4 :(得分:0)

如果您正在使用SQL Server 2012,我建议使用TRY_CONVERT:

select TRY_CONVERT(int, '.')返回NULL而不是错误。