sql-server-2008-r2 - 我运行 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?
解决方案
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. |
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
另外,请注意,ISNUMERIC
对于您可能不想将其视为数字的值(例如空字符串、'1E' 等),它将返回 1。考虑使用替代方法。不幸的是,更健壮的TRY_CONVERT
功能TRY_CAST
直到 SQL Server 2012 才可用,因此您需要使用一种技术,例如LIKE
如果您需要在早期版本中进行更严格的解析。重要的是,SQL Server 2008 R2 支持将于下个月结束(以及兼容级别 80),因此升级将是最好的长期解决方案,允许使用TRY_PARSE/TRY_CONVERT
.
推荐阅读
- javascript - 添加 then 后测试失败并捕获承诺
- c++ - 如何在 Windows 中仅为平板电脑模式启动 Qt 虚拟键盘
- bash - 为什么在 3 字节文件上使用 cat 时出现“cat:写入错误:输入/输出错误”
- postgresql - 如何使用 libpqxx 将 oracle 的指标用于 postgresql
- r - 变异和追加结果中的for循环
- python - 如何使用 QPainterPath 裁剪图像而不保存图像的其余部分
- c - 为什么指针的值还是 20?
- sql - 将数据从 Firebird 获取到 SQL Server 的最佳方式是什么,反之亦然?
- python - 如何检测python-requests中的断开连接保持连接?
- c# - 对大小为 n 的数组进行左旋转操作移位