首先,感谢您的帮助!你真的有所作为,我非常感激。
所以我有一个Varchar列,它有一个16位数字,例如:1000550152872026
select *
FROM Orders
where isnumeric([ord_no]) = 0
返回:0行
select cast([ord_no] as bigint)
FROM Progression_PreCall_Orders o
order by [ord_no]
返回:将数据类型varchar转换为bigint时出错。
如何将这个16位数字转换为math数据类型,以便我可以从中添加和减去另一列?
更新:发现科学记数法存储为varchar ex:1.00054E + 15
如何将其转换回数字?
答案 0 :(得分:2)
DECIMAL数据类型似乎工作正常:
DECLARE @myVarchar AS VARCHAR(32)
SET @myVarchar = '1000550152872026'
DECLARE @myDecimal AS DECIMAL(38,0)
SET @myDecimal = CAST(@myVarchar AS DECIMAL(38,0))
SELECT @myDecimal + 1
此外,这是IsNumeric
返回1
但转换为DECIMAL失败的快速示例:
DECLARE @myVarchar AS VARCHAR(32)
SET @myVarchar = '1000550152872026E10'
SELECT ISNUMERIC(@myVarchar)
DECLARE @myDecimal AS DECIMAL(38,0)
SET @myDecimal = CAST(@myVarchar AS DECIMAL(38,0)) --This statement will fail
修改强>
如果你正在处理用科学记数法写的值,你可以尝试CONVERT
浮动:
DECLARE @Orders AS TABLE(OrderNum NVARCHAR(64), [Date] DATETIME)
INSERT INTO @Orders VALUES('100055015287202', GETDATE())
INSERT INTO @Orders VALUES('100055015287203', GETDATE())
INSERT INTO @Orders VALUES('1.00055015287E+15', GETDATE()) --sci notation
SELECT
CONVERT(FLOAT, OrderNum, 2) +
CAST(REPLACE(CONVERT(VARCHAR(10), GETDATE(), 120), '-', '') AS FLOAT)
FROM @Orders
答案 1 :(得分:2)
WITH validOrds AS
(
SELECT ord_no
FROM Orders
WHERE ord_no NOT LIKE '%[^0-9]%'
)
SELECT cast(validOrds.ord_no as bigint) as ord_no
FROM validOrds
LEFT JOIN Orders ords
ON ords.ord_no = validOrds.ord_no
WHERE ords.ord_no is null
请查看此链接,了解为什么isnumeric无法正常运行的解释:http://www.sqlservercentral.com/articles/IsNumeric/71512/
请查看此帖子,了解用户遇到类似问题的SO帖子: Error converting data type varchar
因此,您应该始终为每列使用正确的数据类型,除非您有非常具体的理由这样做,否则......在将值保存到列时,您需要格外小心以确保它们确实是有效值