Sql server 2008 r2 我在SQL Server 2008级别80中运行ISNUMERIC(';<;string>;';),但它返回1,而不是0

Sql server 2008 r2 我在SQL Server 2008级别80中运行ISNUMERIC(';<;string>;';),但它返回1,而不是0,sql-server-2008-r2,Sql Server 2008 R2,我在SQL Server 2008 R2的80级运行codeSELECT ISNUMERIC('121212,12'),但它返回1,而不是0 我在微软网页上读到,这段代码在80级时返回0,在90级时返回1 为什么它在80级返回1 ANSI/ISO SQL标准(和SQL Server)使用作为十进制分隔符,而不是逗号,因此此是数字的类测试将失败。至于为什么这在80(SQL 2000兼容级别)中有效,ISNUMERIC的更严格行为是。在SQL Server 2000和兼容级别80中,逗号被完全忽略,

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

我在微软网页上读到,这段代码在80级时返回0,在90级时返回1

为什么它在80级返回1

ANSI/ISO SQL标准(和SQL Server)使用
作为十进制分隔符,而不是逗号,因此此
是数字的
类测试将失败。至于为什么这在80(SQL 2000兼容级别)中有效,
ISNUMERIC
的更严格行为是。在SQL Server 2000和兼容级别80中,逗号被完全忽略,因此即使非常无效的值也将返回1,例如
ISNUMERIC(',123',45678.89,,,')
,而在以后的级别中,这将返回0

旧的SQLServer2005文档中关于此行为的兼容性表不正确,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.                          |
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
|兼容性级别设置为80 |兼容性级别设置为90|
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
|在SELECT ISNUMERIC(“”)中,忽略其中嵌入的逗号在SELECT ISNUMERIC(“”)中,其中嵌入的逗号很重要|
|例如,下面的SELECT ISNUMERIC('121212,12')查询返回1例如,以下SELECT ISNUMERIC('121212,12')查询返回0|
|这表明字符串121212,12是数字这表示字符串121212,12不是数字|
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+

也请注意,<代码> ISTIMECTION/COD>将返回1个您可能不想考虑为数值的值(例如,空字符串、“1E”等)。考虑使用另一种方法。不幸的是,更强大的

TRY\u CONVERT
TRY\u CAST
函数直到SQL Server 2012才可用,因此如果在早期版本中需要更严格的解析,则需要使用类似
的技术。重要的是,SQL Server 2008 R2支持将于下个月结束(以及兼容级别80),因此升级将是最好的长期解决方案,允许使用
TRY\u PARSE/TRY\u CONVERT

ANSI/ISO SQL标准(和SQL Server)使用
作为十进制分隔符,而不是逗号,所以这个
是数值的
类测试将失败。至于为什么这在80(SQL 2000兼容级别)中有效,
ISNUMERIC
的更严格行为是。在SQL Server 2000和兼容级别80中,逗号被完全忽略,因此即使非常无效的值也将返回1,例如
ISNUMERIC(',123',45678.89,,,')
,而在以后的级别中,这将返回0

旧的SQLServer2005文档中关于此行为的兼容性表不正确,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.                          |
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
|兼容性级别设置为80 |兼容性级别设置为90|
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+
|在SELECT ISNUMERIC(“”)中,忽略其中嵌入的逗号在SELECT ISNUMERIC(“”)中,其中嵌入的逗号很重要|
|例如,下面的SELECT ISNUMERIC('121212,12')查询返回1例如,以下SELECT ISNUMERIC('121212,12')查询返回0|
|这表明字符串121212,12是数字这表示字符串121212,12不是数字|
+-------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+

也请注意,<代码> ISTIMECTION/COD>将返回1个您可能不想考虑为数值的值(例如,空字符串、“1E”等)。考虑使用另一种方法。不幸的是,更强大的

TRY\u CONVERT
TRY\u CAST
函数直到SQL Server 2012才可用,因此如果在早期版本中需要更严格的解析,则需要使用类似
的技术。重要的是,SQL Server 2008 R2支持将于下个月结束(以及兼容级别80),因此升级将是最好的长期解决方案,允许使用
TRY\u PARSE/TRY\u CONVERT

我尝试选择ISNUMERIC('123.23'),但它返回1
ISNUMERIC('123.23')
应该返回1,因为这是一个数字文字。这不是您所期望的吗?我在SQL server 2008 R2的80级中尝试过。我想在80级0@NganMai,我想你的困惑是由于旧文件中的一个错误。我已经更新了我的答案来详细说明这一点。我尝试选择ISNUMERIC('123.23'),但它返回1
ISNUMERIC('123.23')
应该返回1,因为这是一个数字文本。这不是您所期望的吗?我在SQL server 2008 R2的80级中尝试过。我想在80级0@NganMai,我想你的孔子