SQL Server 2008 中的 try_parse

Cha*_*aka 6 sql-server

在 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:?

Pan*_*vos 6

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\n
DECLARE @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\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:空字符串,但如果需要,可以用 CASE WHEN ... IS NULL THEN NULL ELSE ... END 替换为 NULL。

\n\n

带有数字的变量也是如此。

\n\n
DECLARE @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\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:123.10

\n\n

最好的问候,\n离子

\n