我在列
中有这些可能的值1
65
5 excellent
54
-1
-
.
如果我使用isnumeric和最后一个例子我得到1,但是当我尝试转换为数字时我得到了一个错误。我想在函数中使用try-catch,但我不能,我该如何处理?
答案 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
而不是错误。