Вопрос по sql-server – Кастинг сервера MS SQL без исключения

31

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

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

select convert(float, 'fjsdhf')

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

Ваш Ответ

6   ответов
12

try_cast try_convert try_parse

34

оператора:

 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;) все равно выдаст ошибку.

Также выдает ошибку на неизвестных символах, которые печатаются в виде квадратов.
Это хороший метод, но все равно выдает ошибку, если столбец содержит только-.
В SQL Server 2008 R2IsNumeric возвращает 0 или 1, а не логическое значение. Так вам нужноWHEN ISNUMERIC(myvarcharcolumn) = 1
Хорошая точка @ row1, исправлено.
0

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
0

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

8

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

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

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

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

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

вы можете написать методы стиля 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);
}

Похожие вопросы