2011-06-07 87 views
2

首先,感谢您的全力帮助!你真的有所作为,我非常感谢。使用SQL 2005试图将16位Varchar转换为Bigint错误转换

所以我有一个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位数字转换为数学数据类型,以便我可以从中增加或减去另一列?

UPDATE:找到科学记数法存储为varchar例如:1.00054E + 15

如何转换回成数呢?

+3

这个查询是否返回任何内容:'SELECT * FROM Orders WHERE ord_no LIKE'%[^ 0-9]%''? – 2011-06-07 04:47:34

+0

@Andriy M哇! 3k行! – CodingIsAwesome 2011-06-07 05:07:52

回答

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但转换为十进制失败:

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 
+0

错误转换数据类型为varchar到数字::是我得到:( – CodingIsAwesome 2011-06-07 04:48:22

+0

@CodingIsAwesome更新我的回答表明,你可以数从你的问题转换为十进制。这则IsNumeric可以返回1,问题可能与事实你可能没有想到的结果,你能找到你的查询失败的行吗? – rsbarro 2011-06-07 04:56:13

+0

我似乎无法做到,我已经尝试了几件事情,我确信数字总是以16位数字形式存储在varchar中。 – CodingIsAwesome 2011-06-07 05:01:05

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

因此,你应该总是用正确的数据类型的每一列,除非你有一个非常特殊的理由这样做,否则......即使这样,你就需要格外将值保存到列时要小心它确实是有效的值

+0

哇,我从来没有想过我必须把它分解成什么是数字()= 1!我的上帝,我怎么解释说我不知道​​我的老板会看起来有什么看似自我解释的功能。 – CodingIsAwesome 2011-06-07 05:16:30

+0

@CodingIsAwesome没有人知道该功能是如何工作的,直到遇到像这样的问题... =) – rsbarro 2011-06-07 05:18:06

+0

@rsbarro,然后将该链接保存在您的收藏夹中:D – clyc 2011-06-07 05:22:30