转换后的数据类型(varchar)仍显示转换错误

时间:2017-05-31 11:03:52

标签: sql sql-server

我有一个可以存储文本但是用于存储数字的列(我没有制作系统!)有人将空值放入(即不是内容但不是空)并导致错误: -

  

Msg 8114,Level 16,State 5,Line 1

     

将数据类型varchar转换为数字时出错。

我已将问题简化为以下内容: -

SELECT 
    T1.[FIELD_5], 
    ISNUMERIC(T1.[FIELD_5]), 
    NULLIF(T1.[FIELD_5],''),
    ISNULL(NULLIF(T1.[FIELD_5],''),0),
    CONVERT(DECIMAL(18,5),ISNULL(NULLIF(T1.[FIELD_5],''),0))
FROM  
    [MyTBL] T1 
ORDER BY
    ISNUMERIC(T1.[FIELD_5])

问题数据位于[FIELD_5]

  1. 我可以看到SQL将值视为非数字
  2. 我可以看到NULLIF已成功将其更改为NULL
  3. 我可以看到ISNULL正在将NULLIF结果转为0
  4. CONVERT结果上的ISNULL会产生错误消息,我希望它会导致0.00000

4 个答案:

答案 0 :(得分:2)

使用try_convert()

SELECT T1.[FIELD_5], ISNUMERIC(T1.[FIELD_5]), NULLIF(T1.[FIELD_5], ''),
       COALESCE(NULLIF(T1.[FIELD_5], ''), 0),
       TRY_CONVERT(DECIMAL(18, 5), COALESCE(NULLIF(T1.[FIELD_5], ''), 0))
FROM [MyTBL] T1 
ORDER BY ISNUMERIC(T1.[FIELD_5]);
SQL Server 2012中引入了

try_convert()。如果您使用的是早期版本,则需要使用case表达式。

(我将ISNULL()切换为COALESCE(),因为我更倾向于在可行的情况下使用ANSI标准函数。)

答案 1 :(得分:1)

<强> SQL2012 +

为了找到那些无效的DECIMAL|NUMERIC(18, 5)值,我会使用TRY_PARSETRY_CONVERT函数:

SELECT 
    T1.ID,
    NULLIF(T1.[FIELD_5], '') AS FIELD_5_WithNULLIF
FROM  
    [MyTBL] T1 
WHERE
    T1.[FIELD_5] IS NOT NULL -- It removes from end results NULLs (FIELD_5)
    AND T1.[FIELD_5] <> '' -- It removes empty or SPACE(n) values (FIELD_5)
    AND TRY_PARSE(T1.[FIELD_5] AS DECIMAL(18, 5)) IS NULL -- It removes invalid DECIMAL(18, 5) values (FIELD_5) 

TRY_PARSE的行为如下:如果源字符串值[N][VAR]CHAR是有效的DECIMAL|NUMERIC(18, 5),则它返回具有新数据类型的值,否则返回NULL - &gt;所以它不会抛出异常(“错误”)。

另请参阅:Use new TRY_PARSE() instead of ISNUMERIC() | SQL Server 2012

现在,如果你想将空字符串和无效的源值转换为NULL,那么我会使用

SELECT 
    T1.ID,
    T1.[FIELD_5] AS OriginalValue,
    TRY_PARSE(T1.[FIELD_5] AS DECIMAL(18, 5)) AS ConvertedValue
FROM  
    [MyTBL] T1 

答案 2 :(得分:0)

有一些非数字值,您可以使用以下案例进行检查:

SELECT 
    T1.[FIELD_5], 
    ISNUMERIC(T1.[FIELD_5]), 
    NULLIF(T1.[FIELD_5],''),
    ISNULL(NULLIF(T1.[FIELD_5],''),0),
    CONVERT(DECIMAL(18,5), iif(isnumeric(ISNULL(T1.[FIELD_5]),'0') > 1,T1.[FIELD_5],'0')
    ISNULL(NULLIF(T1.[FIELD_5],''),0))
FROM  
    [MyTBL] T1 
ORDER BY
    ISNUMERIC(T1.[FIELD_5])

将错误引发为&#34;将数据类型varchar转换为数字时出错。 &#34;

console.log()

答案 3 :(得分:0)

这是一个需要更好调查的案例,我应该意识到,在我看来,SQL通常不会出现用户错误。

我在没有order by子句的情况下再次运行它,然后选择了在显示的最后一行之后显示的行(即导致错误的那行)。

[FIELD_5]包含值1E-07,这是Excel中臭名昭着的错误导入!

什么不加起来是为什么当我按ISNUMERIC打开订单时,我没有在列表顶部看到这个值,只有正确管理的空白值。

问题解决了,我应该坚持调查,但我认为将来有必要帮助其他调查。