使用IF IsNumeric作为参数

时间:2012-02-15 00:09:57

标签: sql-server sql-server-2008 tsql

我想知道如何在SQL中使用IsNumeric,它与VBScript略有不同,但我认为我能够绕过它,即:

 IF 1 = ISNUMERIC('5675754674') 
 BEGIN 
 ...
 END

这会是一种解决方法吗?我真正想做的是:

IF ISNUMERIC('5675754674')
BEGIN 
... 
END

但这会产生错误。示例1似乎有效,但只是确保我做得对,无法在网上找到任何好的资源。

3 个答案:

答案 0 :(得分:15)

SQL Server中没有boolean。这意味着你不能只说IF (expression);你必须将它与某些东西进行比较,因为它确实会返回truefalse,就像你在其他语言中习惯的那样。

只是偏好,但我更愿意这样写:

IF ISNUMERIC('5675754674') = 1
BEGIN
...
END

在SQL Server中没有办法避免与第一个示例中的1进行比较。

另外,您应该注意ISNUMERIC()的弱点 - 它可以为“{1}},.CHAR(9)等”数字“值提供误报。 ,e和许多其他非数字字符串。例如,如果你想知道某些东西是否为整数,最好说:

$

但即使这不是一个完整而有效的测试,因为它将为值IF '5675754674' NOT LIKE '%[^0-9]%' BEGIN ... END 返回true,并且对于负值将返回false。

> (2^32)-1的另一个缺点是,如果值可以转换为任何的数值类型,它将返回true,这与 all 数字类型。通常人们会测试ISNUMERIC(),然后尝试将ISNUMERIC()投射到FLOAT,转换失败。

在SQL Server 2012中,您将有一个名为TRY_CONVERT()的新方法,如果转换为指定的数据类型无效,则返回SMALLINT

答案 1 :(得分:5)

你是对的,ISNUMERIC()返回一个int。 您可以查看文档:{​​{3}}

答案 2 :(得分:2)

SQL中的IF语句需要IF之后的布尔表达式 - 请参阅the MSDN reference here.

在不使用CAST()CONVERT()之类的内容的情况下,SQL不是最好的处理类型之间的转换,这意味着intISUNUMERIC()返回只会被解析当你使用一些比较器(=,<,>等)产生一个真/假结果时,作为一个布尔值。

IF ISNUMERIC('5675754674') = 1可能是在TSQL中编写此代码的最佳方式 - 它清楚地描述了'如果此值通过此函数运行返回1(可以作为数值数据类型计算)的意图,那么执行此操作事情。'

考虑到这一点,您应该知道ISNUMERIC仅检查您传入的值将评估为-any-可用的数值数据类型。如果您正在运行的数据包含科学记数法或其他不正常现象,这可能会导致麻烦;有关详细信息,请参阅here