Стандарт 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
вернет 1 для значений, которые вы, возможно, не захотите считать числовыми (например, пустая строка, '1E' и т. Д.).Рассмотрите возможность использования альтернативного метода.К сожалению, более надежные функции TRY_CONVERT
и TRY_CAST
недоступны до SQL Server 2012, поэтому вам нужно использовать метод, такой как LIKE
, если вам требуется более строгий анализ в более ранних версиях.Важно отметить, что поддержка SQL Server 2008 R2 заканчивается в следующем месяце (вместе с уровнем совместимости 80), поэтому обновление будет лучшим долгосрочным решением, позволяющим использовать TRY_PARSE/TRY_CONVERT
.