Я пытаюсь написать свою собственную функцию CLR, чтобы заменить встроенную функцию sql "TRY_CONVERT", поскольку мне нужно больше контролировать преобразование дат и чисел (например, встроенная функция не может обрабатывать преобразования DECIMAL, которые содержат научную нотацию).
Я пробовал это:
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static object TRY_CONVERT(SqlDbType type, SqlString input)
{
switch (type)
{
case SqlDbType.Decimal:
decimal decimalOutput;
return decimal.TryParse(input.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out decimalOutput) ? decimalOutput : (decimal?)null;
case SqlDbType.BigInt:
long bigIntOutput;
return long.TryParse(input.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out bigIntOutput) ? bigIntOutput : (long?)null;
case SqlDbType.Date:
case SqlDbType.DateTime:
case SqlDbType.DateTime2:
DateTime dateTimeOutput;
return DateTime.TryParse(input.Value, CultureInfo.CreateSpecificCulture("en-GB"), DateTimeStyles.None, out dateTimeOutput) ? dateTimeOutput : (DateTime?)null;
case SqlDbType.NVarChar:
case SqlDbType.VarChar:
return string.IsNullOrWhiteSpace(input.Value) ? null : input.Value;
default:
throw new NotImplementedException();
}
}
но мне не нравится тип SqlDbType
при сборке.
Можно ли передать «target_type», используемый во встроенной функции, или мне придется передать его в виде строки или создать отдельные методы TRY_CONVERT для каждого типа, который я хочу использовать?