我在SQL Server 2008 R2的80级运行代码SELECT ISNUMERIC('121212,12')
,但是返回1,而不是0。
我在Microsoft页中读到,这段代码将在80级返回0,在90级返回1。Link reference
SELECT ISNUMERIC('121212,12')
为什么它在80级返回1?
答案 0 :(得分:2)
ANSI / ISO SQL标准(和SQL Server)使用.
作为小数分隔符,而不是逗号,因此此ISNUMERIC
类测试将失败。关于为什么它可以在80(SQL 2000兼容级别)下工作,对于ISNUMERIC
来说,更严格的行为是a change introduced in SQL 2005。在SQL Server 2000和兼容级别80中,逗号将被完全忽略,因此,即使是非常无效的值也将返回1,例如ISNUMERIC(',123,,45678.89,,,')
,而在更高级别中将返回0。
旧的SQL Server 2005文档中关于此行为的兼容性表不正确,其中80和90行为向后列出,这可能导致了您的问题。以下是实际行为以及应如何记录。
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
| Compatibility-level setting of 80 | Compatibility-level setting of 90 |
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
| In SELECT ISNUMERIC('<string>'), embedded commas within <string> are ignored. | In SELECT ISNUMERIC('<string>'), embedded commas within <string> are significant. |
| For example, the following SELECT ISNUMERIC('121212,12') query returns 1. | For example, the following SELECT ISNUMERIC('121212,12') query returns 0. |
| This indicate that the string 121212,12 is numeric. | This indicates that the string 121212,12 is not numeric. |
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
此外,请注意,ISNUMERIC
对于您可能不希望视为数字的值(例如,空字符串,“ 1E”等)将返回1。考虑使用替代方法。不幸的是,更健壮的TRY_CONVERT
和TRY_CAST
函数直到SQL Server 2012才可用,因此,如果需要在早期版本中进行更严格的解析,则需要使用诸如LIKE
之类的技术。重要的是,SQL Server 2008 R2支持将于下个月终止(以及兼容级别80),因此升级将是最佳的长期解决方案,允许使用TRY_PARSE/TRY_CONVERT
。