有多少种方法可以生成将varchar转换为不会被ISNUMERIC()捕获的数字的错误?

scr*_*Owl 1 sql sql-server

我在加载大量的表到SQL Server,并从它们转换的过程中varchar,以特定的数据类型(int,date,等).令人沮丧的是,有多少种不同的方法可以打破从字符串到数字(int,decimal等)的转换,并且没有一种简单的诊断工具来查找有问题的行(除此之外ISNUMERIC()不能一直工作).

这是我打破转换的方法列表,不会被抓住ISNUMERIC().

  • 该字符串包含科学记数法(即3.55E-10)
  • 该字符串包含空格('')
  • 该字符串包含一个非字母数字符号('$',' - ',',')

这是我目前正在使用的补偿:

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
Run Code Online (Sandbox Code Playgroud)

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

SQL*_*L_M 5

不要使用ISNUMERIC().如果您在2012年以上,那么您可以使用TRY_CAST或TRY_CONVERT.

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

    SELECT * 
    FROM #TableA
    WHERE ColA NOT LIKE '%[^0-9]%'
Run Code Online (Sandbox Code Playgroud)