在 SQL Server 2008 中获得相同输出的最简单方法是什么?
SQLServer 2012:
select
try_parse(Isnull('123.66',0) as float) as a ,
try_parse(Isnull('.',0) as float) as b
Run Code Online (Sandbox Code Playgroud)
结果
a b
------------
123.66 NULL
Run Code Online (Sandbox Code Playgroud)
SQLServer 2008:?
TRY_PARSE做两件事 - 使用特定区域性解析文本,如果转换失败则返回 NULL。在 SQL Server 2008 中,您可以使用该ISNUMERIC函数模拟此功能的一部分,如下所示:
select
CASE
WHEN ISNUMERIC(@input)=1 and LEFT(@input,1) LIKE'[0-9]' THEN
CAST(@input as float)
ELSE
NULL
END,
Run Code Online (Sandbox Code Playgroud)
ISNUMERIC即使 for.或 '.5'也会返回 1 ,导致转换失败。这包含在第二次检查中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
Run Code Online (Sandbox Code Playgroud)
所以你可以写
SELECT dbo.try_parse_float('123,4'), try_parse_float('.')
----- ----
123.4 NULL
Run Code Online (Sandbox Code Playgroud)
编辑
最安全和最快的选择是避免将数值作为文本存储在数据库中,确保在加载期间解析数据。例如,.NET 和 OLEDB 提供程序可以解析"123-"为,-123而 T-SQL 不能。
在加载期间处理自定义格式也更容易,例如float.TryParseExact在将表单数据保存到数据库之前进行调用,或者在 SSIS ETL 脚本中使用 C# 脚本组件。
Ion*_*nic -1
您可以使用此代码片段,它应该可以完成您正在寻找的事情。\n将其添加到更大表格上的选择中应该不是什么大问题。只需将变量替换为代码列即可。
\n\n这是示例:
\n\nDECLARE @string nvarchar(255)\nSET @string = 'Hali\xe2\x82\xachHalo'\n\nSELECT Substring(\n @string,\n PATINDEX('%[0-9.]%',@string),\n PATINDEX('%[^0-9.]%',\n Substring(\n @string,\n PATINDEX(\n '%[0-9.]%',\n @string\n ),\n LEN(@string)\n )\n )-1\n )\nGO\nRun Code Online (Sandbox Code Playgroud)\n\n结果:空字符串,但如果需要,可以用 CASE WHEN ... IS NULL THEN NULL ELSE ... END 替换为 NULL。
\n\n带有数字的变量也是如此。
\n\nDECLARE @string nvarchar(255)\nSET @string = 'Hali123.10\xe2\x82\xachHalo'\n\nSELECT Substring(\n @string,\n PATINDEX('%[0-9.]%',@string),\n PATINDEX('%[^0-9.]%',\n Substring(\n @string,\n PATINDEX(\n '%[0-9.]%',\n @string\n ),\n LEN(@string)\n )\n )-1\n )\nGO\nRun Code Online (Sandbox Code Playgroud)\n\n结果:123.10
\n\n最好的问候,\n离子
\n| 归档时间: |
|
| 查看次数: |
9141 次 |
| 最近记录: |