3

我在一列中有这个可能的值

1
65
5 excellent
54
-1
-
.

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

4

5 回答 5

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]%'

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

于 2013-07-24T15:24:49.307 回答
1

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

选择 case isumeric('a') when 1 then convert(int,'a') else null end

于 2013-07-24T15:21:56.763 回答
0

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

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

于 2013-07-24T15:49:50.233 回答
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
于 2013-07-24T15:24:23.360 回答
0

TRY…CATCH 构造不能用于用户定义的函数。

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

于 2013-07-24T15:30:30.097 回答