我有大量的卡令牌(16位数字)从xml文件上传到sql-server。问题是我将它们视为表达式,示例如下:
3.3733E+15 3.3737E+15 3.3737E+15 3.3737E+15 3.37391E+15 3.37391E+15 3.37398E+15 3.37453E+15 3.37468E+15 3.37468E+15 3.3747E+15 3.37486E+15 3.37486E+15 3.37567E+15 3.3759E+15 3.3759E+15
有什么建议将它们更改为16位数字吗?我试图更改数据类型,但出现错误"Conversion failed when converting thevarchar value '3.37201E+15' to data type int"
"Conversion failed when converting thevarchar value '3.37201E+15' to data type int"
感谢帮助!
编辑:
@XLAnt参见下面的代码。我从另一个表创建此表,而该表只是从xml文件插入的。这是因为TOKEN列中的某些行为空,可能会导致错误吗?
CREATE TABLE MULTICURRENCY_CHECK ( TOKEN varchar(255) ) /*Merges all card tokens into 1 column, as in xml they are spread across different columns*/ INSERT INTO MULTICURRENCY_CHECK ( TOKEN ) SELECT no FROM gpstransactionsnew2 UNION ALL SELECT no19 FROM gpstransactionsnew2 UNION ALL SELECT no68 FROM gpstransactionsnew2 UNION ALL SELECT no93 FROM gpstransactionsnew2 UNION ALL SELECT no107 FROM gpstransactionsnew2 UNION ALL SELECT no121 FROM gpstransactionsnew2 SELECT REPLACE(TOKEN, 'OW1', ' ') FROM MULTICURRENCY_CHECK /*Converts exponential expression to number*/ SELECT CONVERT(numeric(16,0), CAST(TOKEN AS FLOAT)) FROM MULTICURRENCY_CHECK
尝试在转换之前将字符串强制转换为float:
SELECT CONVERT(numeric(16,0), CAST(TOKEN AS FLOAT)) FROM MULTICURRENCY_CHECK
我不知道您的XML源中这些数字的格式是什么,但是通过提供的数据,您最终会得到33733,例如后面是一堆零。如果您的XML精度更高,也许您应该调整导入设置以保持此精度,而不是尝试在数据库中处理精度。
尝试使用ISNUMERIC来测试您的字符串,以避免出现转换错误。添加列的原始输出将使您能够检查哪个值转换失败(即转换为0)。
ISNUMERIC
SELECT TOKEN, CONVERT(NUMERIC(16, 0), CAST(CASE WHEN ISNUMERIC(TOKEN) = 1 THEN TOKEN ELSE 0 END AS FLOAT)) FROM MULTICURRENCY_CHECK