TRY_PARSE
做两件事 - 使用特定区域性解析文本并在转换失败时返回 NULL。在 SQL Server 2008 中,您可以使用以下命令来模拟此功能的一部分:ISNUMERIC
函数,如此处显示 https://stackoverflow.com/questions/2000045/tsql-cast-string-to-integer-or-return-default-value:
select
CASE
WHEN ISNUMERIC(@input)=1 and LEFT(@input,1) LIKE'[0-9]' THEN
CAST(@input as float)
ELSE
NULL
END,
ISNUMERIC
即使对于.
或“.5”,导致转换失败。第二次检查涵盖了这一点LEFT(@input,1) LIKE'[0-9]'
您可以创建一个标量函数,这样您就不必每次要转换值时都键入所有这些内容:
CREATE FUNCTION try_parse_float(@input varchar(20))
returns float
AS
begin
declare @result float;
select @result=CASE
WHEN ISNUMERIC(@input)=1 and LEFT(@input,1) LIKE'[0-9]'
THEN CAST(@input as float)
ELSE NULL
END;
return @result;
end
所以你可以写
SELECT dbo.try_parse_float('123,4'), try_parse_float('.')
----- ----
123.4 NULL
EDIT
最安全、最快的选择就是避免将数值作为文本存储在数据库中,而是确保在加载期间解析数据。例如.NET和OLEDB提供者可以解析"123-"
to -123
而 T-SQL 则不能。
在加载过程中处理自定义格式也更容易,例如使用float.TryParseExact
在将表单数据保存到数据库之前调用,或者使用 SSIS ETL 脚本中的 C# 脚本组件调用。