Подтвердить что ты не робот

Кастинг без исключения MS SQL-сервера

Есть ли какая-либо функция "конвертировать" на сервере MS SQL, которая позволяет безопасно отображать типы (без исключения исключения). Мне нужно что-то вроде "tryParse" в С# lang, но как оператор SQL.

Более подробно, мне нужен следующий оператор, возвращающий нуль или любое другое, но исключение исключения.

выберите convert (float, 'fjsdhf')

заблаговременно.

4b9b3361

Ответ 1

Это будет нечисло по умолчанию для 0 и не потребует другого оператора:

 SELECT CASE 
    WHEN ISNUMERIC(myvarcharcolumn)=1 THEN 
       CONVERT(float, REPLACE(LTRIM(RTRIM(myvarcharcolumn)), ',', '.')) 
    ELSE 0 END AS myfloatcolumn

Вызов функции REPLACE() используется для изменения запятых по периодам. В некоторых культурах запятые используются как разделитель десятичных чисел (например, "1,25" вместо "1.25" ), но если ваш сервер не настроен с одной из них в качестве культуры по умолчанию, ISNUMERIC() вернет 1, но CONVERT ( ) выдает ошибку. Это означает, что ваши строки не должны использовать запятые в качестве разделителей тысяч, но в большинстве случаев запятая для десятичного заполнителя скорее всего будет десятичным заполнителем.

Вызов LTRIM (RTRIM()) заключается в том, что ISNUMERIC() возвращает 1 для строки с ведущими или конечными пробелами, но CONVERT() не может с ними справиться. Итак, вы должны обрезать свои строки.

Единственная оставшаяся потенциальная проблема заключается в том, что ISNUMERIC() вернет 1, если число может быть представлено как int, currency, decimal или float, но вы только конвертируете в float. Реально, float может хранить практически все, что вы бросаете на него, но если вы пытались преобразовать в int вместо этого, ISNUMERIC() вернет 1 для значения типа "2.5", но CONVERT (int, "2.5" ) будет все равно выдайте ошибку.

Ответ 2

В SQL SERVER 2012 есть новые функции для работы с этим

try_cast try_convert try_parse

Ответ 4

Если версия SQL, которую вы используете, поддерживает CLR, вы можете написать методы стиля TryParse. \ Однако он не соответствует вашим критериям добавления пользовательских функций в db. Но это, вероятно, будет быстрее, чем SQL UDF.

что-то вроде

[SqlFunction]
public static SqlDouble TryParseDouble(SqlString str)
{
  Double d;
  bool success = Double.TryParse(str, out d);
  if (!success)
    return SqlDouble.Null;
  return new SqlDouble(d);
}

Ответ 5

FWIW, учитывая, что этот вопрос почти 6 лет: в SQL Server 2012 вы можете использовать TRY_CONVERT, который вернет NULL при ошибке; вероятно, именно то, что вы хотите.