有没有在MS SQL服务器的任何“转换”功能,可以安全地投类型的(没有出现任何的异常)。 我需要这样的东西在C#郎但作为SQL语句“的TryParse”。
更详细的,我需要下面的语句返回零或任何其他人,但抛出的异常。
选择转换(浮动, 'fjsdhf')
提前致谢。
有没有在MS SQL服务器的任何“转换”功能,可以安全地投类型的(没有出现任何的异常)。 我需要这样的东西在C#郎但作为SQL语句“的TryParse”。
更详细的,我需要下面的语句返回零或任何其他人,但抛出的异常。
选择转换(浮动, 'fjsdhf')
提前致谢。
这将默认的非数值运算到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”)会还是抛出一个错误。
在SQL Server 2012中也有新的功能来处理这个
try_cast try_convert try_parse
您可以测试一个值是数字与TSQL函数ISNUMERIC()
http://msdn.microsoft.com/en-us/library/ms186272.aspx
而且,如果你是不是已经意识到这一点,TSQL现在有一个TRY CATCH构造。
http://msdn.microsoft.com/en-us/library/ms179296.aspx
如果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);
}
FWIW,考虑这个问题几乎是6岁:在SQL Server 2012中您可以使用TRY_CONVERT
将返回NULL上的错误; 这可能正是你想要的。
试试这个,
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