我想知道如何在SQL中使用IsNumeric,它与VBScript略有不同,但我认为我能够绕过它,即:
IF 1 = ISNUMERIC('5675754674')
BEGIN
...
END这会是一种绕过它的方法吗?我真正想做的是:
IF ISNUMERIC('5675754674')
BEGIN
...
END但这给出了一个错误。示例1似乎可以工作,但只是为了确保我做得正确,在网上找不到任何关于它的好资源。
发布于 2012-02-15 08:14:40
SQL Server中没有boolean。这意味着您不能只说IF (expression);您必须将它与某些东西进行比较,因为它返回的true或false的意义可能与您在其他语言中所习惯的相同。
这只是我的偏好,但我更喜欢这样写:
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,对于负值,它将返回false。
ISNUMERIC()的另一个缺点是,如果值可以转换为任何数值类型,它将返回true,这与所有数值类型并不相同。通常,人们测试ISNUMERIC(),然后尝试将FLOAT转换为SMALLINT,但转换失败。
在SQL Server2012中,您将拥有一个名为TRY_CONVERT()的新方法,如果到指定数据类型的转换无效,该方法将返回NULL。
发布于 2012-02-15 08:14:09
您是对的,ISNUMERIC()返回一个int。您可以查看文档:ISNUMERIC()
发布于 2012-02-15 08:26:48
SQL中的IF语句要求在IF后面有一个布尔表达式-请参见the MSDN reference here.
在不使用CAST()或CONVERT()的情况下,SQL在处理类型之间的转换方面并不是最好的,这意味着当您使用某种比较器(=、<、>等)来产生true/false结果时,ISUNUMERIC()返回的int值只会被解析为布尔值。
IF ISNUMERIC('5675754674') = 1可能是用TSQL写出来的最好的方式--它清楚地描述了“如果通过这个函数运行的这个值返回1(可以作为一个数值数据类型),那么执行这个操作”的意图。
考虑到这一点,您应该知道,ISNUMERIC只检查您传递的值是否将计算为任何可用的数字数据类型。如果您正在运行的数据包含科学记数法或其他不规则性,这可能会带来麻烦;有关更多信息,请参阅here。
https://stackoverflow.com/questions/9286152
复制相似问题