2012-02-15 174 views
7

我想知道如何在SQL中使用则IsNumeric,这是从VBScript有点不同,但我想我能避开它,即:使用IF则IsNumeric作为参数

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

请问这是一种方式周围?我真正想要做的是:

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

但是,这给出了一个错误。示例1似乎可行,但只要确保我正确地做到这一点,就无法在网上找到任何有用的资源。

回答

14

SQL Server中没有boolean。这意味着你不能只说IF (expression);您必须将其与某些内容进行比较,因为它的确会返回truefalse,这与您在其他语言中习惯使用的意义相同。

只是一个偏好,但我宁愿是这样写的:

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

在SQL Server中没有办法避免的比较1,在你的第二个例子。

也顺便你应该知道的ISNUMERIC()的弱点 - 它可以给“数字”值,如.CHAR(9)e$和其他非数字的字符串的主机误报。如果你想知道如果事情是一个整数,例如,最好说:

IF '5675754674' NOT LIKE '%[^0-9]%' 
BEGIN 
... 
END 

但是,即使这不是一个完整的,有效的测试,因为它会为价值> (2^32)-1返回true,它会返回负假值。

另一个缺点ISNUMERIC()是,它会返回真,如果该值可以被转换为数值类型,这是不一样的所有数字类型的任何。通常人们测试ISNUMERIC(),然后尝试将FLOAT投射到SMALLINT,转换失败。

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

5

你说得对,ISNUMERIC()返回一个int。 您可以查看文档:ISNUMERIC()

2

SQL中的IF声明要求IF后一个布尔表达式 - 见the MSDN reference here.

SQL是不是在处理类型之间没有铸造使用类似CAST()CONVERT(),这意味着int价值ISUNUMERIC()回报最好的只有在使用某个比较器(=,<,>等)才能产生真/假结果时,才会被解析为布尔值。

IF ISNUMERIC('5675754674') = 1可能是用TSQL写出来的最好方法 - 它清楚地描述了'如果通过此函数运行此值返回1(可以评估为数字数据类型),然后执行此操作。'

考虑到这一点,您应该知道ISNUMERIC只会检查您传入的值是否会评估为任何可用的数字数据类型。如果您正在运行的数据包含科学记数法或其他违规行为,这可能会导致麻烦;有关更多信息,请参阅here