代码之家  ›  专栏  ›  技术社区  ›  screechOwl

将varchar转换为数值时,ISNUMERIC()无法捕捉到的错误有多少种生成方法?

  •  1
  • screechOwl  · 技术社区  · 6 年前

    varchar 到特定数据类型( int , date 等等)。一个挫败感是有多少种不同的方法可以中断从字符串到数字(int、decimal等)的转换,并且没有一个简单的诊断工具可以找到有问题的行(此外 ISNUMERIC()

    下面是我的列表,列出了打破转换的方法 .

    • 字符串包含空白(“”)
    • 字符串包含非字母数字符号(“$”、“-”、“,”)

    以下是我目前用来补偿的:

    SELECT 
        CASE 
           WHEN [MyColumn] IN ('','-') THEN NULL    -- deals with blanks
           WHEN [MyColumn] LIKE '%E%' THEN CONVERT(DECIMAL(20, 4), CONVERT(FLOAT(53), [MyColumn]))            -- deals with scientific notation
           ELSE CAST(REPLACE(REPLACE([MyColumn] , '$', ''), '-', '') AS DECIMAL(20, 4)) 
        END [MyColumn]             -- deals with special characters
    FROM 
        MyTable
    

    其他人还有其他人吗?还是诊断的好方法?

    3 回复  |  直到 6 年前
        1
  •  5
  •   SQL_M    6 年前

    不要使用ISNUMERIC()。如果您在2012+上,则可以使用TRY_CAST或TRY_CONVERT。

    如果您使用的是旧版本,则可以使用以下语法:

        SELECT * 
        FROM #TableA
        WHERE ColA NOT LIKE '%[^0-9]%'
    
        2
  •  0
  •   D-Shih    6 年前

    你可以试着用 LIKE '%[0-9]%' 而不是 ISNUMERIC()

    SELECT col, CASE WHEN col NOT LIKE '%[^0-9]%' and col<>''
                    THEN 1 
                    ELSE 0 
                 END
    FROM T
    
        3
  •  0
  •   S3S    6 年前

    你可以用 NOT LIKE 排除任何不是数字的东西。。。和 REPLACE 替换

    declare @var varchar(64) = '55,5646'
    SELECT
        CASE 
           WHEN replace(replace(@var,'.',''),',','') NOT LIKE '%[^0-9]%' 
           THEN 1 
           ELSE 0 
        END
    

    这允许您接受十进制/数字/浮点转换的小数。