SQL CLR函数来替换TRY_CONVERT
本文关键字:TRY CONVERT 替换 CLR 函数 SQL | 更新日期: 2023-09-27 18:01:13
我正在尝试编写自己的CLR函数来替换内置的"TRY_CONVERT"sql函数,因为我需要更多地控制日期和数字的转换方式(例如,内置函数无法处理包含科学表示法的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();
}
}
但它不喜欢我构建时的CCD_ 1类型。
是否可以像内置函数中使用的那样传递"target_type",或者我必须将其作为字符串传递,或者为我要使用的每种类型创建单独的TRY_CONVERT方法?
object
返回类型转换为sql_variant
,因此必须在SQL中显式转换为正确的数据类型,因此我认为解决此问题的唯一方法是创建具有正确返回类型的单独CLR方法,如
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlDecimal TRY_CONVERT_DECIMAL(SqlString input)
{
decimal decimalOutput;
return !input.IsNull && decimal.TryParse(input.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out decimalOutput) ? decimalOutput : SqlDecimal.Null;
}
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlInt64 TRY_CONVERT_BIGINT(SqlString input)
{
long bigIntOutput;
return !input.IsNull && long.TryParse(input.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out bigIntOutput) ? bigIntOutput : SqlInt64.Null;
}
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlDateTime TRY_CONVERT_DATE(SqlString input)
{
var minSqlDateTime = new DateTime(1753, 1, 1, 0, 0, 0, 0);
var maxSqlDateTime = new DateTime(9999, 12, 31, 23, 59, 59, 0);
DateTime dateTimeOutput;
return !input.IsNull && DateTime.TryParse(input.Value, CultureInfo.CreateSpecificCulture("en-GB"), DateTimeStyles.None, out dateTimeOutput) &&
dateTimeOutput >= minSqlDateTime && dateTimeOutput <= maxSqlDateTime ? dateTimeOutput : SqlDateTime.Null;
}
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlString TRY_CONVERT_NVARCHAR(SqlString input)
{
return input.IsNull || string.IsNullOrWhiteSpace(input.Value) ? SqlString.Null : input.Value;
}