转换语句时仍会出现错误错误将数据类型varchar转换为数字

时间:2017-10-09 11:08:44

标签: sql sql-server

SELECT  
    (CASE 
        WHEN ISNUMERIC(T.UploadTradePrice) = 1 
           THEN CONVERT(NUMERIC(24, 8), T.UploadTradePrice) 
     END) AS TradePrice
FROM 
    dbo.trnUploadTrades T

我在此表中有5051条记录,UploadTradePrice的数据类型为varchar

执行此查询时,我们收到错误消息

  

将数据类型varchar转换为数字

时出错

2 个答案:

答案 0 :(得分:2)

只需使用TRY_CONVERT()

SELECT TRY_CONVERT(NUMERIC(24, 8), T.UploadTradePrice) AS TradePrice
FROM dbo.trnUploadTrades T;

失败的值的一个示例是指数值:

select val, isnumeric(val), try_convert(numeric(10, 2), val)
from (values ('123'), ('abc'), ('1e3')) v(val)

编辑:

该问题最初标记为SQL Server 2012,其中TRY_CONVERT()是正确的答案。在早期版本中,您可以尝试:

SELECT (CASE WHEN ISNUMERIC(T.UploadTradePrice) = 1 AND
                  T.UploadTradePrice NOT LIKE '%[^0-9.]%' AND
                  T.UploadTradePrice NOT LIKE '%.%.%'
             THEN CONVERT(NUMERIC(24, 8), T.UploadTradePrice) 
        END) AS TradePrice
FROM dbo.trnUploadTrades T

答案 1 :(得分:0)

除了使用case语句,为什么不将你的测试放在where子句中的数字,也是包含case语句的else子句的好习惯。

SELECT CONVERT(NUMERIC(24, 8), T.UploadTradePrice)  AS TradePrice
FROM dbo.trnUploadTrades T
WHERE ISNUMERIC(T.UploadTradePrice) = 1