我在SQL Server 2008 R2中运行级别80的代码SELECT ISNUMERIC('121212,12')
,但它返回1,而不是0。
我在第 Microsoft 页中读到,这段代码将在 80 级返回 0,在 90 级返回 1。链接引用
SELECT ISNUMERIC('121212,12')
为什么它在 80 级返回 1?
ANSI/ISO SQL 标准(和 SQL Server)使用.
作为小数分隔符,而不是逗号,因此此ISNUMERIC
类测试将失败。至于为什么这在 80(SQL 2000 兼容级别)中有效,ISNUMERIC
更严格的行为是 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. |
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
另外,请注意,对于您可能不想将其视为数字的值(例如空字符串、"1E"等),ISNUMERIC
将返回 1。考虑使用替代方法。遗憾的是,更强大的TRY_CONVERT
和TRY_CAST
函数在 SQL Server 2012 之前不可用,因此,如果需要在早期版本中进行更严格的分析,则需要使用诸如LIKE
之类的技术。重要的是,SQL Server 2008 R2支持将于下个月结束(以及兼容级别80),因此升级将是最佳的长期解决方案,允许使用TRY_PARSE/TRY_CONVERT
。