MS SQL服务器铸造无异常(MS SQL server casting without excep

2019-07-29 05:40发布

有没有在MS SQL服务器的任何“转换”功能,可以安全地投类型的(没有出现任何的异常)。 我需要这样的东西在C#郎但作为SQL语句“的TryParse”。

更详细的,我需要下面的语句返回零或任何其他人,但抛出的异常。

选择转换(浮动, 'fjsdhf')

提前致谢。

Answer 1:

这将默认的非数值运算到0,且不需要另一份声明:

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

替换()函数调用来改变逗号周期。 逗号在某些文化中用作小数点分隔符(例如,“1,25”,而不是“1.25”),但除非你的服务器设置与按默认的文化之一,ISNUMERIC()将返回1,但CONVERT( )将抛出一个错误。 这并不意味着你的弦不应该使用逗号作为千位分隔符,但在大多数情况下,一个小数点占位符逗号更可能是一个小数占位符。

该LTRIM(RTRIM())的调用是因为ISNUMERIC()将返回1与前导或尾随空格的字符串,但CONVERT()不能与他们打交道。 所以,你必须修剪你的字符串。

剩下的唯一潜在的问题是ISNUMERIC()将返回1,如果数字可以表示为一个int,货币,小数或浮点数,但你只能转换为浮动。 实际上,一个float可以存储几乎任何你扔它,但如果你试图转换为int代替,ISNUMERIC()将返回1,如“2.5”的值,但是CONVERT(INT,“2.5”)会还是抛出一个错误。



Answer 2:

在SQL Server 2012中也有新的功能来处理这个

try_cast try_convert try_parse



Answer 3:

您可以测试一个值是数字与TSQL函数ISNUMERIC()

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

而且,如果你是不是已经意识到这一点,TSQL现在有一个TRY CATCH构造。

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



Answer 4:

如果SQL版本使用的是支持的CLR,你可以写的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);
}


Answer 5:

FWIW,考虑这个问题几乎是6岁:在SQL Server 2012中您可以使用TRY_CONVERT将返回NULL上的错误; 这可能正是你想要的。



Answer 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


文章来源: MS SQL server casting without exception