首页 > 解决方案 > 我运行 ISNUMERIC('') 在 SQL Server 2008 级别 80 中,但它返回 1,而不是 0

问题描述

我在 SQL Server 2008 R2 的 80 级运行代码SELECT ISNUMERIC('121212,12'),但它返回 1,而不是 0。

我在 Microsoft 页面中读到此代码将在 80 级返回 0,在 90 级返回 1。链接参考

SELECT ISNUMERIC('121212,12')

为什么它在 80 级返回 1?

标签: sql-server-2008-r2

解决方案


ANSI/ISO SQL 标准(和 SQL Server).用作小数分隔符,而不是逗号,因此此类ISNUMERIC测试将失败。至于为什么这在 80(SQL 2000 兼容级别)中有效,更严格的行为ISNUMERICSQL 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.


推荐阅读