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转换为数字
时出错
答案 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