使用SQL 2005尝试将16位数Varchar转换为Bigint错误转换

时间:2011-06-07 04:29:47

标签: sql sql-server-2005 types

首先,感谢您的帮助!你真的有所作为,我非常感激。

所以我有一个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

如何将其转换回数字?

2 个答案:

答案 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

因此,您应该始终为每列使用正确的数据类型,除非您有非常具体的理由这样做,否则......在将值保存到列时,您需要格外小心以确保它们确实是有效值