Я запускаю ISNUMERIC ('<string>') в SQL Server 2008 уровня 80, но он возвращает 1, а не 0 - PullRequest
0 голосов
/ 07 июня 2019

Я запускаю код SELECT ISNUMERIC('121212,12') на уровне 80 в SQL Server 2008 R2, но он возвращает 1, а не 0.

Я прочитал на странице Microsoft, этот код вернет 0 на уровне 80 и вернет 1 на уровне90. Ссылка на ссылку

SELECT ISNUMERIC('121212,12')

Почему возвращается 80 на 80 уровне?

1 Ответ

2 голосов
/ 07 июня 2019

Стандарт 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...