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

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

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

select convert(float, 'fjsdhf')

заранее спасибо.

Ответы на вопрос(6)

Решение Вопроса

DECLARE @SoMe1 FLOAT = 100.99;

DECLARE @SoMe2 VARCHAR(10) = 'TEXT HERE';

SELECT CASE WHEN TRY_CONVERT(FLOAT, @SoMe1) IS NULL THEN 0 ELSE @SoMe1 END
AS Rslt;      -- Output will be 100.99

SELECT CASE WHEN TRY_CONVERT(FLOAT, @SoMe2) IS NULL THEN 0 ELSE @SoMe2 END
AS Rslt;      -- Output will be 0

try_cast try_convert try_parse

оператора:

 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 () выдаст ошибку. этоdoes означает, что ваши строки не должны использовать запятые в качестве разделителей тысяч, но в большинстве случаев запятая для десятичного заполнителя с большей вероятностью будет десятичным заполнителем.

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

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

 01 апр. 2014 г., 10:42
Это хороший метод, но все равно выдает ошибку, если столбец содержит только-.
 20 апр. 2012 г., 07:26
В SQL Server 2008 R2IsNumeric возвращает 0 или 1, а не логическое значение. Так вам нужноWHEN ISNUMERIC(myvarcharcolumn) = 1
 26 авг. 2013 г., 08:00
Хорошая точка @ row1, исправлено.
 05 июн. 2015 г., 09:53
Также выдает ошибку на неизвестных символах, которые печатаются в виде квадратов.

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

является ли значение числовым с помощью функции TSQL ISNUMERIC ().

http://msdn.microsoft.com/en-us/library/ms186272.aspx

И, если вы еще этого не знаете, TSQL теперь имеет конструкцию TRY CATCH.

http://msdn.microsoft.com/en-us/library/ms179296.aspx

 05 мар. 2012 г., 16:09
& quot; ВЫБЕРИТЕ ДЕЛО & quot; в ответе ниже лучше и гибче, чем TRY ... CATCH.
 25 июн. 2009 г., 12:40
+1 для TRY..CATCH - это действительно путь!
 AndrewG25 июн. 2009 г., 12:03
TRY CATCH не вписывается в мое решение, так как я ограничен и не могу добавлять дополнительные утверждения. Я считаю, чтобы добавить дополнительную функцию, которая будет делать кастинг безопасно. Что-то вроде «myconvert (тип, данные, значение по умолчанию)», мне интересно, есть ли другой способ освободить меня от добавления пользовательской функции в базу данных.

вы можете написать методы стиля TryParse. \ Это не соответствует вашим критериям добавления пользовательских функций в БД. Но это, вероятно, будет быстрее, чем 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);
}

Ваш ответ на вопрос